Introduction

Lab book for analyses using hierachal computational modelling to identify paramters that define the best model of learning as it applies to fear conditioning acquisition and extinction using FLARe fear conditioning data. Long abstract, justification and analysis plan found in prelim manuscript here

In short:

Aims

  1. Identify model of learning based on a priori hypotheses that best fits the trajectories of fear relevant learning in our FLARe dataset
    • Use all first week data from Validation, app TRT, lab TRT, Pilot, Headphones (n = 223 after exclusions)
    • Include Acquisition, extinction (trajectories representing fear learning and treatment)
    • Identify parameters that define these trajectories
      • e.g. Learnign rate, plateau, first ambiguous trial etc.
  2. Cross validate best fitting model in TEDS data

  3. Are these parameters associated with other emasures of indsividual differences in our datasets?
    • Personality (Neuroticism)
    • Current anxiety symptoms (GAD-7) - equivalent of baseline symptoms (Chris + Meg analyses)
    • Lifetime / trait anxiety (STAI / ASI - FLARe analyses)
    • Current depression symptoms (PHQ-9) - equivalent of baseline symptoms (Chris + Meg analyses)
    • Interpretation biases (IUS, ASSIQ - FLARe analyses)
    • SES (Meg IAPT: benefits, employment etc)
    • Gender (Meg analyses)
    • Emotion regulation profile (potentially LCA based?)

Impact and relevance

Evidence from both human (Richter et al., 2012) and rodent (Galatzer-Levy, Bonanno, Bush, & LeDoux, 2013) studies suggest that trajectories of how we learn and extinguish fear differ between individuals. Different trajectories of fear and extinction have also been found using fear conditioning studies (e.g. Duits et al., 2016), a good model for the learning of, and treatment for, fear and anxiety disorders. It is likely that these trajectories of fear extinction might predict outcomes in exposure-based cognitive behavioural therapy (Kindt, 2014). 
 
Identifying parameters that predict individual trajectories of fear learning and extinction will enable us to harness fear conditioning data more effectively to aid in understanding mechanisms underlying the development of and treatment for anxiety disorders. With more accurate models of these processes, the potential to use fear conditioning paradigms to predict those most at risk of developing an anxiety disorder, and those who might respond best to exposure-based treatments, greatly improves.

Useful references

Sutton and Barto Reinforcement Learning - Textbook on reinforcement learning
Anxiety promotes memory for mood-congruent faces but does not alter loss aversion (Charpentier…Robinson, 2015) - Good example of a sensitivity learning parameter
Hypotheses About the Relationship of Cognition With Psychopathology Should be Tested by Embedding Them Into Empirical Priors (Moutoussist et al., 2018) - Including variables of interest (e.g. anxiety) in the model

Toby Wise has just submitted an aversive learning paper incorporating beta probability distributions in the best model for uncertain learning paramters etc.

A copy of this is

Analysis plan

  1. Define set of a priori models moving from simple to more complex
    • Some paramters to include:
      • Rate of learning (sometimes with punishment reinforcement)
      • Sensitivity to punishment
      • Pre-existing anxiety
      • SES? Gender?
  2. Run each model and compare fit in FLARe pre TEDS data
    • Use Log likelihood and BIC etc.
  3. Select best fitting model

  4. Extract individual data for learning parameters from this model and see what factors best predict it
    • Anxiety (if anxiety isnt best as part of the model)
    • Interpretation biases
    • Tolerance of uncertanty
    • Cognitive emotional control
    • emotional attentional control
    • SES?
    • Gender?
  5. Run all models again in FLARe TEDS
    • Decide if the same model best fits the data again.
    • See if we get similar results from the parameter prediction

Will use a combination of R.Version(3.5.1), RStan (Version 2.18.2, GitRev: 2e1f913d3ca3) and hBayesDM package in R (3.5.1) Ahn, W.-Y., Haines, N., & Zhang, L. (2017). Revealing neuro-computational mechanisms of reinforcement learning and decision-making with the hBayesDM package. Computational Psychiatry, 1, 24-57., which uses RStan

Modelling notes

Intuition

Discussion with Vince Valton and Alex Pike about the best way to fit this model. As the observed outcomes (expectancy ratings) are non binary and are related to eachother (i.e. as you become more likely to select 9, you become less likely to select 1) we should consider each trial for each person for each stimulus as a constantly updating beta distribution. so you might see a pattern like this for the CS+ in acq for example.

So, best model is likely to be one using beta distributions that show the probability distribution for each rating.

We can use sufficient parameters to describe these (i.e. mean / sd or possibly the mode)

A useful intuition of the beta distribtion can be found here

and a useful website here

scaling

We can scale the beta by how aversive participants find the shock. i.e. it might update their learning as if there was .5 a shock or 1.5 of a shock depending on their own sensitivity to the aversiveness / punishment.

alpha

generalisation

We can do this with a single beta distribution for each phase (collapsing over the two stimuli). This would be akin to a per phase generalisation paramaterer in that it will be smaller if they tend to choose the same expectancy for both stimuli and larger if they tend to choose very differently for both stimuli.

However, because these variables are not really equivalent (i.e the reinforcement rate is different for both, and we use this in the model)

So instead we can create a paramater which is the value of cs- weighted by some value of the cs+. How much each individual weights by the Cs+ can be freely estimated by the model and can be the generalisation paramter.

So this would be vminus = vminus + (w)vplus (where the w paramter is the freely estimated paramter per person)

per stimulus We probably want to model cs+ and cs- separately too - so have a beta distribution characterised by sufficient parameters for each.

per trial

All of the above can then also be done with updating per trial.

leaky beta

we also need a model that incorporates ‘leak’. i.e. learning leak - likely that participants will update more based on more recent trials and learn less from the more distant trials as time progresses. See Toby’s paper for more.

uncertainty

We should consider incorportating a paramter that maps to participant uncertainty about outcomes.

anxiety

Might be worth incorporating this as a model paramater / feature. Read this for more.

Hypotheses About the Relationship of Cognition With Psychopathology Should be Tested by Embedding Them Into Empirical Priors (Moutoussist et al., 2018)

Log likelihood notes

As we are using a beta distribution, we will calculate log likelihood based on the probability function for the distribution (i.e. where will the peak of the shape be) given the participants response at each trial. So will add the probability density function given each trial response trial by trial for each of the CS+ and - summed together.

Will obtain 1 log likelihood and then 1 per trial and add together to make sure that these are comparable.

the basic stan terminology for this is below:

beta_lpdf(rating[t,p]|shape1[t,p],shape2[t,p])

where beta_lpdf is the probability density given the rating made and each of the two beta distribution shape paramters that we estimate.

This is what we will use to compare models.

Terminology

V == ‘value’. Baasically a paramter that is about the salience of the stimulus at any given point.
alpha == ‘learning rate’. A parameter that describes how sensitive people are to updating their learning. So a fast learning rate means that learning on any given trial is weighted more based on the trials immediatly preceding than past ones, and a slow learning rate means that all past events influence learning more evenly. Alex’s tennis analogy is good here (Federer - stable player, can predict a win based on all matches; Murray - volatile player; his last match is best predictor of next match performance). beta == ‘confidence’. This is sort of an error term - how much variance in rating choice is there for each person/trial. Can be thought of as the variance, or beta^2 as the sd.

Can be confusing as we are using beta distributions (different thing) which has two sufficient parameters a + b).

Beta distribution visualisation

and how they change depending on whether you change the beta or alpha paramters.

A really nice summary visualisation

A really nice summary visualisation

Here are some simulations I can change and play with the illustrate the same sort of thing.

 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [1] 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95
[21] 1.00
[1] "stable beta, increasing alpha"

[1] "stable alpha, increasing beta"

Models to write / run

Will probably do all per trial. Will do an early sensitivity check to confirm this.

  1. Single beta, no scaling
  2. Single beta, no scaling per trial.
    *** At this point, compare the two above. Ensure the per trial fits better, and if it does then do all below per trial***
  3. “” scaled
  4. Single beta Single alpha reinforcement learning model (estimate both the beta and the alpha i.e. learning rate)
  5. Single beta single alpha reinforcement learning with mean + sd for the beta estimate as a paramter
  6. Beta per stimulus
  7. Beta per stimulus + generalisation paramter (Vminus = vminus + wvplus)
  8. Leaky beta
  9. Leaky beta + uncertainty
  10. Leaky beta + uncertainty + anxiety

Justification of model components

Alpha Learning rate paramter. If high then will be very influenced by previous trial events, if low, then will be more standardly influenced by accumulating events.

  • Single alpha per person
    • Assumes that learning rate is a constant for each individual that might be scaled by other factors, such as certainty or sensitivity.

Betas Variance/certainty parameter

  • Single beta per person
    • Assumes that the general variance around ratings is the same regardless of stimulus. i.e. as much uncertainty for CS+ asn CS-
  • Two beta’s per person
    • Assumes that confidence / uncertainty might differ by stimulus. Presumably as a factor of reinforcement rate.

Analyses

Set up stan

These use Alex Pikes RStan script with minor modification to make it punishment only to see if it runs. Testing that the approach works with the current data set up etc.

The settings for the script are below, including stan chain paramters and directory set up.

This loads the libraries and source files needed to run this script, and sets up RStan

Preliminary

Compare a priori to data

Simulate different learning rates

only doing this ‘accurately’ for the acquisition CS+, as the simulations require probability. I am using contingency for this (0.75). If set for 0 for all other phases and stimuli then it looks as if the learning should be flat regardless of alpha. We expect in reality that this probability will vary between people and will be unlikely to be zero. So test 12 and 18 trials with a probability of 0.5 and 0.2 as well.

12 trials; probability = 0.75
[1] "Simulated learning rates. 12 trials; probability = 0.75 (CSp acq contingency) \n"

12 trials; probability = 0.5
[1] "Simulated learning rates. 12 trials; Probability = 0.5\n"

12 trials; probability = 0.2
[1] "Simulated learning rates. 12 trials; Probability = 0.2\n"

18 trials; probability = 0.5
[1] "Simulated learning rates. 18 trials; Probability = 0.5\n"

18 trials; probability = 0.2
[1] "Simulated learning rates. 18 trials; Probability = 0.2\n"

Plot subset of trajectories in flare


Attaching package: ‘reshape2’

The following objects are masked from ‘package:data.table’:

    dcast, melt

The following object is masked from ‘package:tidyr’:

    smiths

The following objects are masked from ‘package:reshape’:

    colsplit, melt, recast

Try RStan

See if the basic punishment only learning model for the CS+ and CS- works with the FLARe master data

Run the 8schools check

From the rstan github

This is to check that all is compiling and working and to give and idea of data format etc.

Adjust dataframe

load in the week 1 app and lab data for FLARe pilot, TRT and headphones studies. Make it long form.

Try with acquisition data first. This is formatted with no column names, with no missing data.

Derive the n parameter for both files and check these match

stanname='punish_only.stan'
minus_name <- 'bayes_acq_minus.csv'
plus_name <- "bayes_acq_plus.csv"
stanfile <- file.path(scriptdir, stanname)
minusfile <- file.path(datadir,minus_name)
plusfile <- file.path(datadir,plus_name)
minus <- fread(minusfile,data.table=F)
plus <-fread(plusfile,data.table=F)
nacqm <- dim(minus)[1]
nacqp <- dim(plus)[1]
## check that these match and create nsub variable for RStan
if (nacqm == nacqp) {
  print('subject number match')
  nsub <- nacqm
  
  print(paste('nsub set to',nsub,sep=" "))
} else {
  print('WARNING: subject number does not match. Check master dataset')
}
[1] "subject number match"
[1] "nsub set to 342"
# check the file format is ok
minus[1:2,]
  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
1  5  4  3  1  2  2  1  2  3   2   3   2
2  8  8  1  5  4  3  2  1  1   1   1   1
plus[1:2,]
  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
1  5  6  7  4  7  7  6  7  2   8   7   8
2  1  9  9  5  8  8  9  9  9   8   9   8

The expectancy rating datasets look like they are formatted fine and ntrials and nsub variables should exist.

Create scream data

Need to go back to stage zero and keep scream yes/no as a variable. For now to see if this runs create simulated version for the CS+. CS- will remain the same.

screamMinus <- matrix(0L,nrow=nsub, ncol=ntrials)
# Initialise plus dataset in the same way, but make the first trial 1 for everyone, then add 8 additional random 1's per person. Do this in four random patterns to mimic the real data
sc1 <- c(1,1,0,1,0,0,1,1,1,1,1)
sc2 <- c(0,1,1,1,0,0,1,1,1,1,1)
sc3 <- c(1,1,1,0,1,0,1,0,1,1,1)
sc4 <- c(1,0,1,1,0,0,1,1,1,1,1)
screamPlus <- matrix(0L,nrow=nsub, ncol=ntrials)
screamPlus[,1] <- 1
# for (n in 1:dim(screamPlus)[1]) {
#   print(n)
#   screamPlus[n,2:12] <- sample(patts,1,replace=T)
# }
for (n in 1:dim(screamPlus)[1]) {
  
  a <- sample(c(1,4),1)
  
  if (a == 1) {
    screamPlus[n,2:12] <- sc1
  } else if (a == 2) {
    screamPlus[n,2:12] <- sc2
  } else if (a == 3){
    screamPlus[n,2:12] <- sc3
  } else {
    screamPlus[n,2:12] <- sc4
  }
}
make rating data binary

for now to see if stan runs using bernoulli-logit function make binary resposnes from expectancy i.e. >=4.5 ==1, <= 4.5 ==0.

binarise <- function(x) {
  ifelse(x >= 4.5,1,0)
}
minusb <- data.frame(apply(minus,2,function(x) binarise(x)))
plusb <- data.frame(apply(plus,2,function(x) binarise(x)))

Set up procedure to create and sync models.

This directs to my local machine here /Users/kirstin/Dropbox/SGDP/FLARe/FLARe_MASTER/Projects/Hierachal_modelling/Scripts and is remotely linked to the github repository here.

Make sure the most up to date stan file is in the remote repo
check existing paramters

Unhash this if you want to check what the model looks like within the notebook.

Make any changes

use echo to push these to the new file if you want to make changes from here.

Now try run stan

unhash this to run experimental script that checked if stan runs. This was mostly to check data formatting and installation / compilation etc.

flare_data<-list(ntrials=ntrials,nsub=nsub,includeTrial = rep(1,ntrials), screamPlus=t(screamPlus),screamMinus=t(screamMinus),
                 ratingPlus=t(plusb),ratingMinus=t(minusb))
#flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?
#save(flare_fit, file=file.path(datadir,'flare_fit_test'))
#traceplot(flare_fit,'lp__')
# extract fit data
#summary_flare<- summary(flare_fit)
# extract model summary data
#flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)

view the fit information

#summary_flare

extract the loglikelihood using loo

#loo(flare_loglike)

so, good news is this all works. So preliminary check a success. Next need to consider the appropriate model.

Create stan friendly datasets

notes

We need to rescale our dataset here to be between 0 and 1.

Importantly, because we are using the proportion of trials that are not reinforced as a known paramter for statistical reasons (we don’t want a proportion of .75 and 1, better to have .25 and 0), we have made our rescaled expectancy values as 1 - rescaled(x). This means that we will still be able to interpret the results in the expected way (i.e. higher rating is greater expectation of the outcome).

rescale data

rescale the 1-9 expectancy values to be on a 0-1 scale.

stan cannot deal with the extreme limit of the beta, so make the rescaled limits just above 0 and below one

Note that when a value had to be imputed as it was missing it will not be an integer. Thus the function needs to allow for ranges between values.

library(scales)
# rescale and flip so that we are effectively rating the expectation that they WILL NOT hear a scream to match stan
## rescaling such that the distribution spaces the numbers 1-9 evenly. the first interval upper bound would be 0.11, then 0.22 etc. this means that the mid point of each itnerval will be:
print("mid point of each evenly spaced interval representing values between 1-9")
[1] "mid point of each evenly spaced interval representing values between 1-9"
seq(0.5/9,1,1/9)
[1] 0.05555556 0.16666667 0.27777778 0.38888889 0.50000000 0.61111111 0.72222222 0.83333333 0.94444444
## thus 1 will be 1-0.055 etc.
## NOTE: might want to consider making this more flexible. enter in the numer of choice options as a variable - would be very easy. add to function library at later stage
scale_flare <- function(x){
  
  vals <- seq(0.5/9,1,1/9)
  
  for (val in 1:9){
    if (x > val-1 & x <= val){
      x <- 1 - vals[val]
    }
  }
  return(x)
}
## initialise minus_scaled dataframe.
minus_scaled <- data.frame(matrix(ncol=dim(minus)[2],nrow = dim(minus)[1]))
##  populate with rexcaled values
for (sub in 1:dim(minus)[1]){
  for (col in 1:dim(minus)[2]){
    
    minus_scaled[sub,col] <- scale_flare(minus[sub,col])
  }
}
## ditto for plus
plus_scaled <- data.frame(matrix(ncol=dim(minus)[2],nrow = dim(minus)[1]))
for (sub in 1:dim(plus)[1]){
  for (col in 1:dim(plus)[2]){
    
    plus_scaled[sub,col] <- scale_flare(plus[sub,col])
  }
}
## this is the number that will take from the midpoint to the top and bottom for the new boundaries (with ratings representing the midpoint)
cdf_scale <- 1/18

create proportion screams data

This is a vector containing the absolute number of trials where no scream occurred for each stimulus. As there was a 75% reinforcement rate for the CS+ (9/12 trials), this is a vector of ’3’s. For the CS-, no trials were reinforced so is a vector of ’12’s

No_scream_p <- rep(3,nsub)
No_scream_m <- rep(12,nsub)

Create scream data

Create datasets for the acquisition CS- and extinction CS+ and CS- reflecting that no screams occurred at all. Then use the pattern id variable to create a dataset for the acquisition CS+ indicating when a scream occurred for each participant.

## Create the no scream daatsets for all
screamMinus <- matrix(0L,nrow=nsub, ncol=ntrials)
# Initialise plus dataset in the same way, but make the first trial 1 for everyone, then add 8 additional random 1's per person. Do this in four random patterns to mimic the real data
sc1 <- c(1,1,0,1,0,0,1,1,1,1,1)
sc2 <- c(0,1,1,1,0,0,1,1,1,1,1)
sc3 <- c(1,1,1,0,1,0,1,0,1,1,1)
sc4 <- c(1,0,1,1,0,0,1,1,1,1,1)
screamPlus <- matrix(0L,nrow=nsub, ncol=ntrials)
screamPlus[,1] <- 1
# for (n in 1:dim(screamPlus)[1]) {
#   print(n)
#   screamPlus[n,2:12] <- sample(patts,1,replace=T)
# }
for (n in 1:dim(screamPlus)[1]) {
  
  a <- sample(c(1,4),1)
  
  if (a == 1) {
    screamPlus[n,2:12] <- sc1
  } else if (a == 2) {
    screamPlus[n,2:12] <- sc2
  } else if (a == 3){
    screamPlus[n,2:12] <- sc3
  } else {
    screamPlus[n,2:12] <- sc4
  }
}

Create dataset for barplot comparing output

library(ggplot2)
mod_comp <- data.frame(model=NA,BIC=NA)

Baseline models

Model 1: single beta no scaling

notes

Because we use the 1-rescaled expectancy data, no need to try and invert to reinforcement paramters here. As a result we need the stan model to simply be:

alphaPlus[p] =  nothingPlus[p]/ntrials;
alphaMinus[p] =  nothingMinus[p]/ntrials;

run Alex Pike’s stan script for non scaled beta model.

here we try to estimate the alpha paramter of the beta distribution per trial per person per stimulus. (i.e. you have two sufficient paramters for each beta dist, the alpha and beta. we want to estimate the alpha - ).

Eventually we will scale these by the actual ‘value’ of the scream for each person per trial.

Using data loaded in from preliminary tests above.

so this is a beta value per person (assuming the underlying process for the plus and minus are the same)

## decide testing rate (min,med,max or off)
testing('min')
## set up run
stanname='beta_noscaling.stan'
stanfile <- file.path(scriptdir, stanname)
flare_data<-list(ntrials=ntrials,nsub=nsub,nothingPlus = No_scream_p, nothingMinus=No_scream_m,ratingsPlus=plus_scaled,ratingsMinus=minus_scaled)
flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?

SAMPLING FOR MODEL 'beta_noscaling' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.001476 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 14.76 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: Iteration:   1 / 400 [  0%]  (Warmup)
Chain 1: Iteration:  40 / 400 [ 10%]  (Warmup)
Chain 1: Iteration:  80 / 400 [ 20%]  (Warmup)
Chain 1: Iteration: 120 / 400 [ 30%]  (Warmup)
Chain 1: Iteration: 160 / 400 [ 40%]  (Warmup)
Chain 1: Iteration: 200 / 400 [ 50%]  (Warmup)
Chain 1: Iteration: 201 / 400 [ 50%]  (Sampling)
Chain 1: Iteration: 240 / 400 [ 60%]  (Sampling)
Chain 1: Iteration: 280 / 400 [ 70%]  (Sampling)
Chain 1: Iteration: 320 / 400 [ 80%]  (Sampling)
Chain 1: Iteration: 360 / 400 [ 90%]  (Sampling)
Chain 1: Iteration: 400 / 400 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 12.4199 seconds (Warm-up)
Chain 1:                3.75026 seconds (Sampling)
Chain 1:                16.1702 seconds (Total)
Chain 1: 
save(flare_fit, file=file.path(datadir,'flare_fit_test'))
traceplot(flare_fit,'lp__')

# extract fit data
summary_flare<- summary(flare_fit)
NaNs produced
# extract model summary data
#flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
## get some basic output descriptions printed to screen
out_describe(summary_flare)

Attaching package: ‘psych’

The following object is masked _by_ ‘.GlobalEnv’:

    logistic

The following objects are masked from ‘package:scales’:

    alpha, rescale

The following object is masked from ‘package:rstan’:

    lookup

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha

The following object is masked from ‘package:boot’:

    logit
[1] "400 iterations  on 1 chains. "
[1] "Estimated 1 Free paramaters per person"
[1] " "
[1] "Average Rhat"
[1] 1
[1] "beta[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.67 0.26   0.61    0.63 0.13 0.36 2.58  2.23 3.34     16.2 0.01
[1] " "

Model 2: single beta scaled

notes

Simple alteration of the first model. We estimate a scaling parameter per person over all trials and apply this to alpha component per participant.

run Alex Pike’s stan script for scaled beta model.

here we try to estimate the alpha paramter of the beta distribution per trial per person per stimulus. (i.e. you have two sufficient paramters for each beta dist, the alpha and beta. we want to estimate the alpha - ).

Eventually we will scale these by the actual ‘value’ of the scream for each person per trial.

Using data loaded in from preliminary tests above.

so this is a beta value per person (assuming the underlying process for the plus and minus are the same)

## decide testing rate (min,med,max or off)
testing('min')
## set up run
stanname='beta_scaling.stan'
stanfile <- file.path(scriptdir, stanname)
flare_data<-list(ntrials=ntrials,nsub=nsub,nothingPlus = No_scream_p, nothingMinus=No_scream_m,ratingsPlus=plus_scaled,ratingsMinus=minus_scaled)
flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?

SAMPLING FOR MODEL 'beta_scaling' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.001454 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 14.54 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: Iteration:   1 / 400 [  0%]  (Warmup)
Chain 1: Iteration:  40 / 400 [ 10%]  (Warmup)
Chain 1: Iteration:  80 / 400 [ 20%]  (Warmup)
Chain 1: Iteration: 120 / 400 [ 30%]  (Warmup)
Chain 1: Iteration: 160 / 400 [ 40%]  (Warmup)
Chain 1: Iteration: 200 / 400 [ 50%]  (Warmup)
Chain 1: Iteration: 201 / 400 [ 50%]  (Sampling)
Chain 1: Iteration: 240 / 400 [ 60%]  (Sampling)
Chain 1: Iteration: 280 / 400 [ 70%]  (Sampling)
Chain 1: Iteration: 320 / 400 [ 80%]  (Sampling)
Chain 1: Iteration: 360 / 400 [ 90%]  (Sampling)
Chain 1: Iteration: 400 / 400 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 25.0803 seconds (Warm-up)
Chain 1:                59.0046 seconds (Sampling)
Chain 1:                84.0849 seconds (Total)
Chain 1: 
There were 1 transitions after warmup that exceeded the maximum treedepth. Increase max_treedepth above 10. See
http://mc-stan.org/misc/warnings.html#maximum-treedepth-exceededExamine the pairs() plot to diagnose sampling problems
save(flare_fit, file=file.path(datadir,'flare_fit_test'))
traceplot(flare_fit,'lp__')

# extract fit data
summary_flare<- summary(flare_fit)
# extract model summary data
#flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
## get some basic output descriptions printed to screen
out_describe(summary_flare)
[1] "400 iterations  on 1 chains. "
[1] "Estimated 2 Free paramaters per person"
[1] " "
[1] "Average Rhat"
[1] 1
[1] "beta[1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.61 1.7   1.16     1.3 0.44 0.37 22.43 22.05 7.12    71.51 0.09
[1] " "
[1] "scaling[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 3.76 2.83   3.25    3.41 1.09 0.71 44.87 44.15 9.39   129.04 0.15
[1] " "

run Alex Pike’s stan script for scaled beta model.

here we try to estimate the alpha paramter of the beta distribution per trial per person per stimulus. (i.e. you have two sufficient paramters for each beta dist, the alpha and beta. we want to estimate the alpha - ).

Eventually we will scale these by the actual ‘value’ of the scream for each person per trial.

Using data loaded in from preliminary tests above.

so this is a beta value per person (assuming the underlying process for the plus and minus are the same)

## decide testing rate (min,med,max or off)
testing('min')
## set up run
stanname='beta_withRL.stan'
stanfile <- file.path(scriptdir, stanname)
flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus= t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled))
flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?

SAMPLING FOR MODEL 'beta_withRL' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.004774 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 47.74 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: Iteration:   1 / 400 [  0%]  (Warmup)
Chain 1: Iteration:  40 / 400 [ 10%]  (Warmup)
Chain 1: Iteration:  80 / 400 [ 20%]  (Warmup)
Chain 1: Iteration: 120 / 400 [ 30%]  (Warmup)
Chain 1: Iteration: 160 / 400 [ 40%]  (Warmup)
Chain 1: Iteration: 200 / 400 [ 50%]  (Warmup)
Chain 1: Iteration: 201 / 400 [ 50%]  (Sampling)
Chain 1: Iteration: 240 / 400 [ 60%]  (Sampling)
Chain 1: Iteration: 280 / 400 [ 70%]  (Sampling)
Chain 1: Iteration: 320 / 400 [ 80%]  (Sampling)
Chain 1: Iteration: 360 / 400 [ 90%]  (Sampling)
Chain 1: Iteration: 400 / 400 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 43.1126 seconds (Warm-up)
Chain 1:                51.3482 seconds (Sampling)
Chain 1:                94.4608 seconds (Total)
Chain 1: 
save(flare_fit, file=file.path(datadir,'flare_fit_test'))
traceplot(flare_fit,'lp__')

# extract fit data
summary_flare <- summary(flare_fit)
# extract model summary data
#flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
## get some basic output descriptions printed to screen
out_describe(summary_flare)
[1] "400 iterations  on 1 chains. "
[1] "Estimated 2 Free paramaters per person"
[1] " "
[1] "Average Rhat"
[1] 1
[1] "alpha[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.12 0.06    0.1     0.1 0.03 0.05 0.32  0.28 1.71     2.55  0
[1] " "
[1] "beta[1]"
[1] " "
   vars   n mean sd median trimmed mad min max range  skew kurtosis se
X1    1 342    0  0      0       0   0   0   0     0 -0.03    -0.42  0
[1] " "

Model 3: RL, mean defined, single beta

notes

this model includes an alpha learning paramater per person estimating their learning rate and updating based on it. This model needs a dataset that indicates whether a scream occurred for each trial instead of the proportion of times no scream occurred.

Mean to define shape

this model includes an alpha learning paramater per person estimating their learning rate and updating based on it. This model needs a dataset that indicates whether a scream occurred for each trial instead of the proportion of times no scream occurred.

Alex used this stack post to help solve the shape paramters using mean and sd where we assume that v serves as the mean and beta as the sd.

the equations work out to this:

for shape 1:

\[\alpha = \left(\frac{1-\mu}{\sigma^2} - \frac{1}{\mu}\right)\mu^2\]

for shape 2:

\[\beta=\alpha \left(\frac{1}{\mu}-1\right)\]

Hashed this out as it doesnt run!

# ## decide testing rate (min,med,max or off)
# testing('min')
# 
# ## set up run
# stanname='beta_meansd_RL.stan'
# 
# stanfile <- file.path(scriptdir, stanname)
# 
# flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus=t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled))
# 
# flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?
# 
# save(flare_fit, file=file.path(datadir,'flare_fit_test'))
# 
# traceplot(flare_fit,'lp__')
# 
# # extract fit data
# summary_flare<- summary(flare_fit)
# 
# # extract model summary data
# 
# #flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
## get some basic output descriptions printed to screen
# out_describe(summary_flare)

On 500 iterations (i.e. test) the variance in alpha is good, but the traceplot is terrible. Model coverges very poorly. We also have to constrain the beta to be betwqeen 0 and 0.0001. Not sure why this is.

when running for 2000 iterations (1000 warmup)…

This results in the following warning;

There were 2644 divergent transitions after warmup. Increasing adapt_delta above 0.8 may help. See http://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmupThere were 4 transitions after warmup that exceeded the maximum treedepth. Increase max_treedepth above 10. See http://mc-stan.org/misc/warnings.html#maximum-treedepth-exceededThere were 4 chains where the estimated Bayesian Fraction of Missing Information was low. See http://mc-stan.org/misc/warnings.html#bfmi-lowExamine the pairs() plot to diagnose sampling problems

Mean definition 2

The above mean definition does not map the data well (terrible traceplot!). I found this from the MRC BSU and have tried defining the beta parameters assuming V == mean in a slighty different way:

for paramater a:

\[\alpha = \mu\beta/(1-\mu)\]

for parameter b:

\[\beta = \mu(1-\mu)^2/\sigma+\mu-1\]

Still using a single beta here.

hashed this out as it doesnt run (saves time)

# ## decide testing rate (min,med,max or off)
# testing('min')
# 
# ## set up run
# stanname='beta_meansd_RL_2.stan'
# 
# stanfile <- file.path(scriptdir, stanname)
# 
# flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus=t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled))
# 
# flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?
# 
# save(flare_fit, file=file.path(datadir,'flare_fit_test'))
# 
# traceplot(flare_fit,'lp__')
# 
# # extract fit data
# summary_flare<- summary(flare_fit)
# 
# # extract model summary data
#flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
## get some basic output descriptions printed to screen
# out_describe(summary_flare)

Mean definition 3

noted that the shape parameters have slight variations in definition according to discussion here. Updated the script slightly to reflect this based on the reply from ocram.

the first sd term in shape a is changed to variance, so it changes from:

\[\alpha = \left(\frac{1-\mu}{\sigma^2} - \frac{1}{\mu}\right)\mu^2\]

to

\[\alpha = \left(\frac{1-\mu}{\sigma} - \frac{1}{\mu}\right)\mu^2\]

Changes the shape 2 paramter definition from:

\[\beta=\alpha \left(\frac{1}{\mu}-1\right)\]

to

\[\beta = \left(\frac{1-\mu}{\sigma} - \frac{1}{\mu}\right)\mu\left(1-\mu\right)\]

Because this works best, will add loglikelihhod calculation here. Basing this on the probability density function for the beta distribution given the participants actual ratings and sufficient paramters of the distribution per trial.

loglik[p] = loglik[p] + beta_lpdf(ratingsPlus[t,p]|shape1_Plus[t,p],shape2_Plus[t,p]) + beta_lpdf(ratingsMinus[t,p]|shape1_Minus[t,p],shape2_Minus[t,p])

Hashed this out as it doesnt run (saves time)

## decide testing rate (min,med,max or off)
# testing('min')
# 
# ## set up run
# stanname='beta_meansd_RL_3.stan'
# 
# stanfile <- file.path(scriptdir, stanname)
# 
# flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus=t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled))
# 
# flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?
# 
# save(flare_fit, file=file.path(datadir,'flare_fit_test'))
# 
# traceplot(flare_fit,'lp__')
# 
# # extract fit data
# summary_flare<- summary(flare_fit)
# 
# # extract model summary data
# 
# flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
## get some basic output descriptions printed to screen
# out_describe(summary_flare)

This model is substnatially better than either of the other two. Traceplot suggests that the iterations converge as we would like. However, we still need to massively constrain the beta (i.e. confidence / uncertainty) estimates for it to run, otherwise the starting values drop below zero.

Create BIC from log likelihood

## extract log likelihood
# 
# flare_loglike <- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
# 
# #calculate BIC
# 
# FLARe_bic<-bic(ntrials,-colMeans(flare_loglike),2) #number of parameters in that model e.g. 4)
# 
# ## mean BIC as model comparisons tool:
# 
# print("Mean Bayesian information criterion for model")
# mean(FLARe_bic)

Add to bar plot

# 
# mod_comp <- rbind(na.omit(mod_comp,c("Mean 1 beta",mean(FLARe_bic))))
# 
# plot <- ggplot(na.omit(mod_comp),aes(x=model,y=BIC)) +
#   geom_bar(stat = "identity") +
#   coord_flip()
# 
# show(plot)

Mean definition 4

Here I try to define the parameter using simplified mean and precision estimates as per this tutorial. See in particular the paramter estimation on the cubs data.

This results in a relatively simplified paramter estimation compared to model 3.

\[\alpha = \mu * ((\mu * (1-\mu)) / \sigma - 1)\]

where mu is the mean (or value) and sigma is the variance / uncertainty paramter we currently call beta.

and the b (or shape 2) parameter for the distribution is:

\[\beta = (1- \mu) * ((\mu * (1-\mu)) / \sigma - 1)\]

## decide testing rate (min,med,max or off)
testing('min')
## set up run
stanname='beta_meansd_RL_4.stan'
stanfile <- file.path(scriptdir, stanname)
flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus=t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled),cdf_scale=cdf_scale)
flare_fit_best <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?
hash mismatch so recompiling; make sure Stan code ends with a blank line

SAMPLING FOR MODEL 'beta_meansd_RL_4' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.009343 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 93.43 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: Iteration:   1 / 400 [  0%]  (Warmup)
Chain 1: Iteration:  40 / 400 [ 10%]  (Warmup)
Chain 1: Iteration:  80 / 400 [ 20%]  (Warmup)
Chain 1: Iteration: 120 / 400 [ 30%]  (Warmup)
Chain 1: Iteration: 160 / 400 [ 40%]  (Warmup)
Chain 1: Iteration: 200 / 400 [ 50%]  (Warmup)
Chain 1: Iteration: 201 / 400 [ 50%]  (Sampling)
Chain 1: Iteration: 240 / 400 [ 60%]  (Sampling)
Chain 1: Iteration: 280 / 400 [ 70%]  (Sampling)
Chain 1: Iteration: 320 / 400 [ 80%]  (Sampling)
Chain 1: Iteration: 360 / 400 [ 90%]  (Sampling)
Chain 1: Iteration: 400 / 400 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 70.5695 seconds (Warm-up)
Chain 1:                36.785 seconds (Sampling)
Chain 1:                107.355 seconds (Total)
Chain 1: 
save(flare_fit_best, file=file.path(datadir,'flare_fit_simpleMean'))
traceplot(flare_fit_best,'lp__')

# extract fit data
summary_flare_best <- summary(flare_fit_best)
## get some basic output descriptions printed to screen
out_describe(summary_flare_best)
[1] "400 iterations  on 1 chains. "
[1] "Estimated 98 Free paramaters per person"
[1] " "
[1] "Average Rhat"
[1] 1
[1] "alpha[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.07 0.02   0.07    0.07 0.02 0.01 0.15  0.14 0.25     1.15  0
[1] " "
[1] "beta[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.19 0.06    0.2     0.2 0.06 0.04 0.31  0.27 -0.4    -0.47  0
[1] " "
[1] "first[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.49 0.01   0.49    0.49 0.01 0.46 0.53  0.07 -0.67     1.66  0
[1] " "
[1] "loglik[1]"
[1] " "
   vars   n   mean   sd median trimmed  mad    min    max range skew kurtosis   se
X1    1 342 -47.64 5.12 -48.83   -48.2 5.37 -54.07 -33.52 20.55 0.76    -0.32 0.28
[1] " "
[1] "shape1_Plus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.77 0.36   0.66     0.7 0.19 0.43 3.8  3.36 3.54    19.87 0.02
[1] " "
[1] "shape1_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.81 0.37    0.7    0.74 0.2 0.46 3.93  3.47 3.49    19.55 0.02
[1] " "
[1] "shape1_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.37   0.73    0.77 0.21 0.47 4.04  3.57 3.47    19.54 0.02
[1] " "
[1] "shape1_Plus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.82 0.37   0.72    0.75 0.21 0.48 3.92  3.44 3.39    18.13 0.02
[1] " "
[1] "shape1_Plus[5,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.83 0.37   0.72    0.76 0.2 0.47 4.04  3.57 3.49    19.71 0.02
[1] " "
[1] "shape1_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.85 0.38   0.74    0.78 0.21 0.48 4.13  3.65 3.49    19.78 0.02
[1] " "
[1] "shape1_Plus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.82 0.37   0.71    0.75 0.21 0.46 4.02  3.56 3.51     19.9 0.02
[1] " "
[1] "shape1_Plus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.77 0.36   0.66     0.7 0.19 0.43 3.89  3.46 3.57     20.3 0.02
[1] " "
[1] "shape1_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.82 0.37   0.71    0.75 0.21 0.46 4.02  3.56 3.52    19.93 0.02
[1] " "
[1] "shape1_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.85 0.38   0.74    0.78 0.21 0.48 4.12  3.64 3.49     19.8 0.02
[1] " "
[1] "shape1_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.86 0.39   0.75    0.79 0.21 0.49 4.2  3.71  3.5    19.92 0.02
[1] " "
[1] "shape1_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.87 0.39   0.75    0.79 0.21 0.49 4.27  3.78 3.52     20.2 0.02
[1] " "
[1] "shape1_Minus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.77 0.36   0.66     0.7 0.19 0.43 3.8  3.36 3.54    19.87 0.02
[1] " "
[1] "shape1_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.81 0.37    0.7    0.74 0.2 0.46 3.93  3.47 3.49    19.55 0.02
[1] " "
[1] "shape1_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.37   0.73    0.77 0.21 0.47 4.04  3.57 3.47    19.54 0.02
[1] " "
[1] "shape1_Minus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.82 0.37   0.72    0.75 0.21 0.48 3.92  3.44 3.39    18.13 0.02
[1] " "
[1] "shape1_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.83 0.37   0.72    0.76 0.2 0.47 4.04  3.57 3.49    19.71 0.02
[1] " "
[1] "shape1_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.85 0.38   0.74    0.78 0.21 0.48 4.13  3.65 3.49    19.78 0.02
[1] " "
[1] "shape1_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.82 0.37   0.71    0.75 0.21 0.46 4.02  3.56 3.51     19.9 0.02
[1] " "
[1] "shape1_Minus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.77 0.36   0.66     0.7 0.19 0.43 3.89  3.46 3.57     20.3 0.02
[1] " "
[1] "shape1_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.82 0.37   0.71    0.75 0.21 0.46 4.02  3.56 3.52    19.93 0.02
[1] " "
[1] "shape1_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.85 0.38   0.74    0.78 0.21 0.48 4.12  3.64 3.49     19.8 0.02
[1] " "
[1] "shape1_Minus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.86 0.39   0.75    0.79 0.21 0.49 4.2  3.71  3.5    19.92 0.02
[1] " "
[1] "shape1_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.87 0.39   0.75    0.79 0.21 0.49 4.27  3.78 3.52     20.2 0.02
[1] " "
[1] "shape2_Plus[1,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.79 0.4   0.67    0.72 0.19 0.44   4  3.56 3.59     19.3 0.02
[1] " "
[1] "shape2_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.74 0.39   0.62    0.67 0.18 0.4 3.87  3.47 3.64    19.49 0.02
[1] " "
[1] "shape2_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.69 0.39   0.57    0.62 0.17 0.36 3.74  3.37 3.67    19.51 0.02
[1] " "
[1] "shape2_Plus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342  0.7 0.39   0.59    0.63 0.19 0.3 3.88  3.58 3.64    20.03 0.02
[1] " "
[1] "shape2_Plus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.71 0.38    0.6    0.64 0.17 0.38 3.75  3.37 3.66    19.46 0.02
[1] " "
[1] "shape2_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.66 0.38   0.55    0.59 0.17 0.33 3.61  3.28 3.69    19.44 0.02
[1] " "
[1] "shape2_Plus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.73 0.38   0.62    0.66 0.18 0.4 3.78  3.37 3.64    19.39 0.02
[1] " "
[1] "shape2_Plus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.79 0.39   0.67    0.71 0.19 0.44 3.92  3.48 3.57    19.03 0.02
[1] " "
[1] "shape2_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.74 0.38   0.62    0.66 0.18 0.41 3.78  3.38 3.63    19.36 0.02
[1] " "
[1] "shape2_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.68 0.38   0.57    0.61 0.17 0.37 3.65  3.28 3.68    19.49 0.02
[1] " "
[1] "shape2_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.63 0.37   0.52    0.56 0.17 0.32 3.51  3.19  3.7    19.45 0.02
[1] " "
[1] "shape2_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.59 0.37   0.48    0.52 0.16 0.26 3.38  3.11 3.72    19.33 0.02
[1] " "
[1] "shape2_Minus[1,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.79 0.4   0.67    0.72 0.19 0.44   4  3.56 3.59     19.3 0.02
[1] " "
[1] "shape2_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.74 0.39   0.62    0.67 0.18 0.4 3.87  3.47 3.64    19.49 0.02
[1] " "
[1] "shape2_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.69 0.39   0.57    0.62 0.17 0.36 3.74  3.37 3.67    19.51 0.02
[1] " "
[1] "shape2_Minus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342  0.7 0.39   0.59    0.63 0.19 0.3 3.88  3.58 3.64    20.03 0.02
[1] " "
[1] "shape2_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.71 0.38    0.6    0.64 0.17 0.38 3.75  3.37 3.66    19.46 0.02
[1] " "
[1] "shape2_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.66 0.38   0.55    0.59 0.17 0.33 3.61  3.28 3.69    19.44 0.02
[1] " "
[1] "shape2_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.73 0.38   0.62    0.66 0.18 0.4 3.78  3.37 3.64    19.39 0.02
[1] " "
[1] "shape2_Minus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.79 0.39   0.67    0.71 0.19 0.44 3.92  3.48 3.57    19.03 0.02
[1] " "
[1] "shape2_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.74 0.38   0.62    0.66 0.18 0.41 3.78  3.38 3.63    19.36 0.02
[1] " "
[1] "shape2_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.68 0.38   0.57    0.61 0.17 0.37 3.65  3.28 3.68    19.49 0.02
[1] " "
[1] "shape2_Minus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.63 0.37   0.52    0.56 0.17 0.32 3.51  3.19  3.7    19.45 0.02
[1] " "
[1] "shape2_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.59 0.37   0.48    0.52 0.16 0.26 3.38  3.11 3.72    19.33 0.02
[1] " "
[1] "VPlus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.49 0.01   0.49    0.49 0.01 0.46 0.53  0.07 -0.67     1.66  0
[1] " "
[1] "VPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 342 0.53 0.02   0.53    0.53 0.02 0.46 0.6  0.14 -0.38     1.29  0
[1] " "
[1] "VPlus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.56 0.03   0.56    0.56 0.02 0.47 0.66   0.2 -0.31     1.13  0
[1] " "
[1] "VPlus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.55 0.04   0.53    0.54 0.04 0.47 0.68  0.22 0.62    -0.32  0
[1] " "
[1] "VPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.02   0.55    0.55 0.02 0.47 0.62  0.16 -0.62      1.4  0
[1] " "
[1] "VPlus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.57 0.03   0.57    0.57 0.02 0.47 0.68  0.21 -0.5     1.16  0
[1] " "
[1] "VPlus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.53 0.02   0.53    0.53 0.01 0.47 0.57   0.1 -1.31     2.42  0
[1] " "
[1] "VPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5   0 0.46 0.51  0.05 -1.83     5.22  0
[1] " "
[1] "VPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.53 0.02   0.53    0.53 0.01 0.47 0.57   0.1 -1.39     2.67  0
[1] " "
[1] "VPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.56 0.03   0.56    0.56 0.02 0.47 0.63  0.16 -0.84     1.53  0
[1] " "
[1] "VPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.59 0.03   0.59    0.59 0.03 0.48 0.69  0.21 -0.65     1.25  0
[1] " "
[1] "VPlus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.61 0.04   0.61    0.61 0.03 0.48 0.73  0.25 -0.59     1.15  0
[1] " "
[1] "VMinus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.49 0.01   0.49    0.49 0.01 0.46 0.53  0.07 -0.67     1.66  0
[1] " "
[1] "VMinus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 342 0.53 0.02   0.53    0.53 0.02 0.46 0.6  0.14 -0.38     1.29  0
[1] " "
[1] "VMinus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.56 0.03   0.56    0.56 0.02 0.47 0.66   0.2 -0.31     1.13  0
[1] " "
[1] "VMinus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.55 0.04   0.53    0.54 0.04 0.47 0.68  0.22 0.62    -0.32  0
[1] " "
[1] "VMinus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.02   0.55    0.55 0.02 0.47 0.62  0.16 -0.62      1.4  0
[1] " "
[1] "VMinus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.57 0.03   0.57    0.57 0.02 0.47 0.68  0.21 -0.5     1.16  0
[1] " "
[1] "VMinus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.53 0.02   0.53    0.53 0.01 0.47 0.57   0.1 -1.31     2.42  0
[1] " "
[1] "VMinus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5   0 0.46 0.51  0.05 -1.83     5.22  0
[1] " "
[1] "VMinus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.53 0.02   0.53    0.53 0.01 0.47 0.57   0.1 -1.39     2.67  0
[1] " "
[1] "VMinus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.56 0.03   0.56    0.56 0.02 0.47 0.63  0.16 -0.84     1.53  0
[1] " "
[1] "VMinus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.59 0.03   0.59    0.59 0.03 0.48 0.69  0.21 -0.65     1.25  0
[1] " "
[1] "VMinus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.61 0.04   0.61    0.61 0.03 0.48 0.73  0.25 -0.59     1.15  0
[1] " "
[1] "deltaPlus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.51 0.01   0.51    0.51 0.01 0.47 0.54  0.07 0.67     1.66  0
[1] " "
[1] "deltaPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis se
X1    1 342 0.47 0.02   0.47    0.47 0.02 0.4 0.54  0.14 0.38     1.29  0
[1] " "
[1] "deltaPlus[3,1]"
[1] " "
   vars   n  mean  sd median trimmed  mad   min  max range skew kurtosis   se
X1    1 342 -0.07 0.5  -0.49   -0.07 0.17 -0.66 0.53   1.2 0.06    -1.99 0.03
[1] " "
[1] "deltaPlus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min  max range  skew kurtosis   se
X1    1 342 -0.03 0.53   0.46   -0.03 0.08 -0.68 0.53  1.22 -0.06    -1.99 0.03
[1] " "
[1] "deltaPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.46 0.02   0.45    0.45 0.02 0.38 0.53  0.16 0.62      1.4  0
[1] " "
[1] "deltaPlus[6,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.57 0.03  -0.57   -0.57 0.02 -0.68 -0.47  0.21  0.5     1.16  0
[1] " "
[1] "deltaPlus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.53 0.02  -0.53   -0.53 0.01 -0.57 -0.47   0.1 1.31     2.42  0
[1] " "
[1] "deltaPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5   0 0.49 0.54  0.05 1.83     5.22  0
[1] " "
[1] "deltaPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.47 0.02   0.47    0.47 0.01 0.43 0.53   0.1 1.39     2.67  0
[1] " "
[1] "deltaPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.44 0.03   0.44    0.44 0.02 0.37 0.53  0.16 0.84     1.53  0
[1] " "
[1] "deltaPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.41 0.03   0.41    0.41 0.03 0.31 0.52  0.21 0.65     1.25  0
[1] " "
[1] "deltaMinus[1,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.49 0.01  -0.49   -0.49 0.01 -0.53 -0.46  0.07 0.67     1.66  0
[1] " "
[1] "deltaMinus[2,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad  min   max range skew kurtosis se
X1    1 342 -0.53 0.02  -0.53   -0.53 0.02 -0.6 -0.46  0.14 0.38     1.29  0
[1] " "
[1] "deltaMinus[3,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.56 0.03  -0.56   -0.56 0.02 -0.66 -0.47   0.2 0.31     1.13  0
[1] " "
[1] "deltaMinus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.55 0.04  -0.53   -0.54 0.04 -0.68 -0.47  0.22 -0.62    -0.32  0
[1] " "
[1] "deltaMinus[5,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.54 0.02  -0.55   -0.55 0.02 -0.62 -0.47  0.16 0.62      1.4  0
[1] " "
[1] "deltaMinus[6,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.57 0.03  -0.57   -0.57 0.02 -0.68 -0.47  0.21  0.5     1.16  0
[1] " "
[1] "deltaMinus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.53 0.02  -0.53   -0.53 0.01 -0.57 -0.47   0.1 1.31     2.42  0
[1] " "
[1] "deltaMinus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad   min   max range skew kurtosis se
X1    1 342 -0.5 0.01   -0.5    -0.5   0 -0.51 -0.46  0.05 1.83     5.22  0
[1] " "
[1] "deltaMinus[9,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.53 0.02  -0.53   -0.53 0.01 -0.57 -0.47   0.1 1.39     2.67  0
[1] " "
[1] "deltaMinus[10,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.56 0.03  -0.56   -0.56 0.02 -0.63 -0.47  0.16 0.84     1.53  0
[1] " "
[1] "deltaMinus[11,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.59 0.03  -0.59   -0.59 0.03 -0.69 -0.48  0.21 0.65     1.25  0
[1] " "

Create BIC from log likelihood

## extract log likelihood
flare_loglike_best <- extract_log_lik(flare_fit_best, parameter_name = "loglik", merge_chains = TRUE)
#calculate BIC
FLARe_bic<-bic(ntrials,-colMeans(flare_loglike_best),2) #number of parameters in that model e.g. 4)
## mean BIC as model comparisons tool:
print("Mean Bayesian information criterion for model")
[1] "Mean Bayesian information criterion for model"
mean(FLARe_bic)
[1] 100.2561

Add to bar plot

mod_comp <- rbind(mod_comp,c("Means 1 beta",mean(FLARe_bic)))
plot <- ggplot(na.omit(mod_comp),aes(x=model,y=BIC)) +
  geom_bar(stat = "identity") +
  coord_flip()
show(plot)

Model 4: RL, mode defined, single beta

notes

Used this post to guide this. particularly:

For a beta distribution with shape parameters a and b, the mode is (a-1)/(a+b-2). Suppose we have a desired mode, and we want to determine the corresponding shape parameters. Here’s the solution. First, we express the “certainty” of the estimate in terms of the equivalent prior sample size, k=a+b, with k≥2. The certainty must be at least 2 because it essentially assumes that the prior contains at least one “head” and one “tail,” which is to say that we know each outcome is at least possible. Then a little algebra reveals: a = mode * (k-2) + 1 b = (1-mode) * (k-2) + 1

shape 1 as mode with v and beta as beta shape parameters

For this version we try and estimate the ‘mode’ to be shape 1. KIRSTIN:: explain here

## decide testing rate (min,med,max or off)
# 
# testing('skip')
# 
# ## set up run
# 
# stanname='beta_mode_RL.stan'
# 
# stanfile <- file.path(scriptdir, stanname)
# 
# flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus=t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled))
# 
# flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?
# 
# save(flare_fit, file=file.path(datadir,'flare_fit_simpleMode'))
# 
# traceplot(flare_fit,'lp__')
# 
# # extract fit data
# summary_flare<- summary(flare_fit)
# 
# # extract model summary data
# 
# #flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
## get some basic output descriptions printed to screen
# out_describe(summary_flare)

v as mode

For this version we assume that V is the mode (above we assumed it serves as the mean) and beta is the certainty aspect (i.e. k)

What this does is basically treat the expected rating (value) as the a parameter for the distribution (scaled by their certainity - beta) and 1-that value as the b parameter (again, scaled by the uncertainty).

so you have a ratio of their selected value per trial (mode across iterations?) to how far from the highest possible choice they are.

## decide testing rate (min,med,max or off)
testing('min')
## set up run
stanname='beta_mode_RL_2.stan'
stanfile <- file.path(scriptdir, stanname)
flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus=t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled),cdf_scale=cdf_scale)
flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?

SAMPLING FOR MODEL 'beta_mode_RL_2' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.008999 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 89.99 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: Iteration:   1 / 400 [  0%]  (Warmup)
Chain 1: Iteration:  40 / 400 [ 10%]  (Warmup)
Chain 1: Iteration:  80 / 400 [ 20%]  (Warmup)
Chain 1: Iteration: 120 / 400 [ 30%]  (Warmup)
Chain 1: Iteration: 160 / 400 [ 40%]  (Warmup)
Chain 1: Iteration: 200 / 400 [ 50%]  (Warmup)
Chain 1: Iteration: 201 / 400 [ 50%]  (Sampling)
Chain 1: Iteration: 240 / 400 [ 60%]  (Sampling)
Chain 1: Iteration: 280 / 400 [ 70%]  (Sampling)
Chain 1: Iteration: 320 / 400 [ 80%]  (Sampling)
Chain 1: Iteration: 360 / 400 [ 90%]  (Sampling)
Chain 1: Iteration: 400 / 400 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 45.5254 seconds (Warm-up)
Chain 1:                31.9236 seconds (Sampling)
Chain 1:                77.449 seconds (Total)
Chain 1: 
save(flare_fit, file=file.path(datadir,'flare_fit_test'))
traceplot(flare_fit,'lp__')

# extract fit data
summary_flare<- summary(flare_fit)
## get some basic output descriptions printed to screen
out_describe(summary_flare)
[1] "400 iterations  on 1 chains. "
[1] "Estimated 97 Free paramaters per person"
[1] " "
[1] "Average Rhat"
[1] 0.9587641
[1] "alpha[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.07 0.03   0.06    0.06 0.02 0.01 0.22  0.22 1.27     4.44  0
[1] " "
[1] "beta[1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 1.69 0.81   1.44    1.54 0.4 0.95 8.93  7.97 3.73    22.67 0.04
[1] " "
[1] "loglik[1]"
[1] " "
   vars   n   mean   sd median trimmed  mad    min   max range skew kurtosis   se
X1    1 342 -48.44 4.79 -49.67  -48.97 4.88 -54.23 -34.5 19.73 0.79    -0.23 0.26
[1] " "
[1] "shape1_Plus[1,1]"
[1] " "
   vars   n mean  sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.4   0.72    0.77 0.2 0.48 4.46  3.99 3.73    22.67 0.02
[1] " "
[1] "shape1_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.89 0.41   0.78    0.82 0.21 0.5 4.58  4.08 3.68    22.34 0.02
[1] " "
[1] "shape1_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.94 0.42   0.82    0.86 0.22 0.53 4.69  4.16 3.63    21.88 0.02
[1] " "
[1] "shape1_Plus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.92 0.42   0.82    0.85 0.24 0.51 4.56  4.05 3.49    19.81 0.02
[1] " "
[1] "shape1_Plus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.92 0.42    0.8    0.84 0.22 0.52 4.67  4.16 3.66    22.22 0.02
[1] " "
[1] "shape1_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.96 0.43   0.84    0.89 0.23 0.54 4.78  4.24 3.61    21.79 0.02
[1] " "
[1] "shape1_Plus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.9 0.42   0.78    0.82 0.22 0.51 4.65  4.14 3.68    22.41 0.02
[1] " "
[1] "shape1_Plus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.41   0.72    0.77 0.21 0.47 4.52  4.05 3.72    22.63 0.02
[1] " "
[1] "shape1_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.9 0.42   0.77    0.82 0.21 0.51 4.64  4.13 3.69    22.47 0.02
[1] " "
[1] "shape1_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.94 0.42   0.82    0.87 0.22 0.53 4.75  4.21 3.64    22.09 0.02
[1] " "
[1] "shape1_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.98 0.43   0.86    0.91 0.23 0.56 4.85   4.3 3.59    21.66 0.02
[1] " "
[1] "shape1_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 1.02 0.44    0.9    0.94 0.24 0.58 4.95  4.37 3.55    21.24 0.02
[1] " "
[1] "shape1_Minus[1,1]"
[1] " "
   vars   n mean  sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.4   0.72    0.77 0.2 0.48 4.46  3.99 3.73    22.67 0.02
[1] " "
[1] "shape1_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.89 0.41   0.78    0.82 0.21 0.5 4.58  4.08 3.68    22.34 0.02
[1] " "
[1] "shape1_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.94 0.42   0.82    0.86 0.22 0.53 4.69  4.16 3.63    21.88 0.02
[1] " "
[1] "shape1_Minus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.92 0.42   0.82    0.85 0.24 0.51 4.56  4.05 3.49    19.81 0.02
[1] " "
[1] "shape1_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.92 0.42    0.8    0.84 0.22 0.52 4.67  4.16 3.66    22.22 0.02
[1] " "
[1] "shape1_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.96 0.43   0.84    0.89 0.23 0.54 4.78  4.24 3.61    21.79 0.02
[1] " "
[1] "shape1_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.9 0.42   0.78    0.82 0.22 0.51 4.65  4.14 3.68    22.41 0.02
[1] " "
[1] "shape1_Minus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.41   0.72    0.77 0.21 0.47 4.52  4.05 3.72    22.63 0.02
[1] " "
[1] "shape1_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.9 0.42   0.77    0.82 0.21 0.51 4.64  4.13 3.69    22.47 0.02
[1] " "
[1] "shape1_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.94 0.42   0.82    0.87 0.22 0.53 4.75  4.21 3.64    22.09 0.02
[1] " "
[1] "shape1_Minus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.98 0.43   0.86    0.91 0.23 0.56 4.85   4.3 3.59    21.66 0.02
[1] " "
[1] "shape1_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 1.02 0.44    0.9    0.94 0.24 0.58 4.95  4.37 3.55    21.24 0.02
[1] " "
[1] "shape2_Plus[1,1]"
[1] " "
   vars   n mean  sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.4   0.72    0.77 0.2 0.48 4.46  3.99 3.73    22.67 0.02
[1] " "
[1] "shape2_Plus[2,1]"
[1] " "
   vars   n mean  sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.79 0.4   0.67    0.72 0.2 0.43 4.35  3.91 3.76    22.73 0.02
[1] " "
[1] "shape2_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.75 0.39   0.63    0.68 0.19 0.38 4.24  3.86 3.76    22.59 0.02
[1] " "
[1] "shape2_Plus[4,1]"
[1] " "
   vars   n mean  sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.76 0.4   0.65    0.69 0.21 0.3 4.36  4.06 3.78    23.68 0.02
[1] " "
[1] "shape2_Plus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.77 0.39   0.65     0.7 0.19 0.41 4.25  3.84 3.77    22.73 0.02
[1] " "
[1] "shape2_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.72 0.39   0.61    0.65 0.19 0.35 4.15  3.79 3.77    22.55 0.02
[1] " "
[1] "shape2_Plus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.79 0.39   0.67    0.72 0.19 0.44 4.28  3.84 3.78    22.83 0.02
[1] " "
[1] "shape2_Plus[8,1]"
[1] " "
   vars   n mean  sd median trimmed mad  min max range skew kurtosis   se
X1    1 342 0.84 0.4   0.73    0.77 0.2 0.47 4.4  3.93 3.73    22.59 0.02
[1] " "
[1] "shape2_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.79 0.39   0.68    0.72 0.19 0.44 4.29  3.85 3.77    22.78 0.02
[1] " "
[1] "shape2_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.74 0.39   0.63    0.67 0.19 0.39 4.18  3.79 3.78     22.7 0.02
[1] " "
[1] "shape2_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.7 0.38   0.59    0.63 0.19 0.34 4.08  3.74 3.78    22.48 0.02
[1] " "
[1] "shape2_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.67 0.38   0.56     0.6 0.19 0.27 3.98   3.7 3.77    22.21 0.02
[1] " "
[1] "shape2_Minus[1,1]"
[1] " "
   vars   n mean  sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.4   0.72    0.77 0.2 0.48 4.46  3.99 3.73    22.67 0.02
[1] " "
[1] "shape2_Minus[2,1]"
[1] " "
   vars   n mean  sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.79 0.4   0.67    0.72 0.2 0.43 4.35  3.91 3.76    22.73 0.02
[1] " "
[1] "shape2_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.75 0.39   0.63    0.68 0.19 0.38 4.24  3.86 3.76    22.59 0.02
[1] " "
[1] "shape2_Minus[4,1]"
[1] " "
   vars   n mean  sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.76 0.4   0.65    0.69 0.21 0.3 4.36  4.06 3.78    23.68 0.02
[1] " "
[1] "shape2_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.77 0.39   0.65     0.7 0.19 0.41 4.25  3.84 3.77    22.73 0.02
[1] " "
[1] "shape2_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.72 0.39   0.61    0.65 0.19 0.35 4.15  3.79 3.77    22.55 0.02
[1] " "
[1] "shape2_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.79 0.39   0.67    0.72 0.19 0.44 4.28  3.84 3.78    22.83 0.02
[1] " "
[1] "shape2_Minus[8,1]"
[1] " "
   vars   n mean  sd median trimmed mad  min max range skew kurtosis   se
X1    1 342 0.84 0.4   0.73    0.77 0.2 0.47 4.4  3.93 3.73    22.59 0.02
[1] " "
[1] "shape2_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.79 0.39   0.68    0.72 0.19 0.44 4.29  3.85 3.77    22.78 0.02
[1] " "
[1] "shape2_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.74 0.39   0.63    0.67 0.19 0.39 4.18  3.79 3.78     22.7 0.02
[1] " "
[1] "shape2_Minus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.7 0.38   0.59    0.63 0.19 0.34 4.08  3.74 3.78    22.48 0.02
[1] " "
[1] "shape2_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.67 0.38   0.56     0.6 0.19 0.27 3.98   3.7 3.77    22.21 0.02
[1] " "
[1] "VPlus[1,1]"
[1] " "
   vars   n mean sd median trimmed mad min max range skew kurtosis se
X1    1 342  0.5  0    0.5     0.5   0 0.5 0.5     0  NaN      NaN  0
[1] " "
[1] "VPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis se
X1    1 342 0.53 0.01   0.53    0.53 0.01 0.5 0.61  0.11 1.27     4.44  0
[1] " "
[1] "VPlus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis se
X1    1 342 0.56 0.03   0.56    0.56 0.02 0.51 0.7  0.19 1.06     3.48  0
[1] " "
[1] "VPlus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.55 0.04   0.53    0.55 0.02 0.51 0.76  0.25 1.28     1.87  0
[1] " "
[1] "VPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.55 0.02   0.55    0.55 0.01 0.51 0.64  0.13 0.52     1.81  0
[1] " "
[1] "VPlus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.58 0.03   0.57    0.58 0.02 0.51 0.71   0.2 0.57     1.73  0
[1] " "
[1] "VPlus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.01   0.54    0.54 0.01 0.51 0.56  0.05 -0.41     0.39  0
[1] " "
[1] "VPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5   0 0.41 0.51   0.1 -4.38    29.07  0
[1] " "
[1] "VPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.53 0.01   0.53    0.53 0.01 0.51 0.56  0.05 -0.33     0.52  0
[1] " "
[1] "VPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.56 0.02   0.56    0.56 0.02 0.51 0.66  0.14 0.42     1.53  0
[1] " "
[1] "VPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.59 0.03   0.59    0.59 0.03 0.52 0.73  0.21 0.54     1.79  0
[1] " "
[1] "VPlus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.61 0.04   0.61    0.61 0.03 0.52 0.78  0.26 0.51     1.67  0
[1] " "
[1] "VMinus[1,1]"
[1] " "
   vars   n mean sd median trimmed mad min max range skew kurtosis se
X1    1 342  0.5  0    0.5     0.5   0 0.5 0.5     0  NaN      NaN  0
[1] " "
[1] "VMinus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis se
X1    1 342 0.53 0.01   0.53    0.53 0.01 0.5 0.61  0.11 1.27     4.44  0
[1] " "
[1] "VMinus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis se
X1    1 342 0.56 0.03   0.56    0.56 0.02 0.51 0.7  0.19 1.06     3.48  0
[1] " "
[1] "VMinus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.55 0.04   0.53    0.55 0.02 0.51 0.76  0.25 1.28     1.87  0
[1] " "
[1] "VMinus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.55 0.02   0.55    0.55 0.01 0.51 0.64  0.13 0.52     1.81  0
[1] " "
[1] "VMinus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.58 0.03   0.57    0.58 0.02 0.51 0.71   0.2 0.57     1.73  0
[1] " "
[1] "VMinus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.01   0.54    0.54 0.01 0.51 0.56  0.05 -0.41     0.39  0
[1] " "
[1] "VMinus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5   0 0.41 0.51   0.1 -4.38    29.07  0
[1] " "
[1] "VMinus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.53 0.01   0.53    0.53 0.01 0.51 0.56  0.05 -0.33     0.52  0
[1] " "
[1] "VMinus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.56 0.02   0.56    0.56 0.02 0.51 0.66  0.14 0.42     1.53  0
[1] " "
[1] "VMinus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.59 0.03   0.59    0.59 0.03 0.52 0.73  0.21 0.54     1.79  0
[1] " "
[1] "VMinus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.61 0.04   0.61    0.61 0.03 0.52 0.78  0.26 0.51     1.67  0
[1] " "
[1] "deltaPlus[1,1]"
[1] " "
   vars   n mean sd median trimmed mad min max range skew kurtosis se
X1    1 342  0.5  0    0.5     0.5   0 0.5 0.5     0  NaN      NaN  0
[1] " "
[1] "deltaPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 342 0.47 0.01   0.47    0.47 0.01 0.39 0.5  0.11 -1.27     4.44  0
[1] " "
[1] "deltaPlus[3,1]"
[1] " "
   vars   n  mean  sd median trimmed  mad   min  max range skew kurtosis   se
X1    1 342 -0.08 0.5  -0.52   -0.08 0.14 -0.69 0.49  1.18 0.06    -1.99 0.03
[1] " "
[1] "deltaPlus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min  max range  skew kurtosis   se
X1    1 342 -0.04 0.53   0.47   -0.03 0.04 -0.76 0.49  1.25 -0.07    -1.99 0.03
[1] " "
[1] "deltaPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.45 0.02   0.45    0.45 0.01 0.36 0.49  0.13 -0.52     1.81  0
[1] " "
[1] "deltaPlus[6,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.58 0.03  -0.57   -0.58 0.02 -0.71 -0.51   0.2 -0.57     1.73  0
[1] " "
[1] "deltaPlus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.54 0.01  -0.54   -0.54 0.01 -0.56 -0.51  0.05 0.41     0.39  0
[1] " "
[1] "deltaPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5   0 0.49 0.59   0.1 4.38    29.07  0
[1] " "
[1] "deltaPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.47 0.01   0.47    0.47 0.01 0.44 0.49  0.05 0.33     0.52  0
[1] " "
[1] "deltaPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.44 0.02   0.44    0.44 0.02 0.34 0.49  0.14 -0.42     1.53  0
[1] " "
[1] "deltaPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.41 0.03   0.41    0.41 0.03 0.27 0.48  0.21 -0.54     1.79  0
[1] " "
[1] "deltaMinus[1,1]"
[1] " "
   vars   n mean sd median trimmed mad  min  max range skew kurtosis se
X1    1 342 -0.5  0   -0.5    -0.5   0 -0.5 -0.5     0  NaN      NaN  0
[1] " "
[1] "deltaMinus[2,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min  max range  skew kurtosis se
X1    1 342 -0.53 0.01  -0.53   -0.53 0.01 -0.61 -0.5  0.11 -1.27     4.44  0
[1] " "
[1] "deltaMinus[3,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad  min   max range  skew kurtosis se
X1    1 342 -0.56 0.03  -0.56   -0.56 0.02 -0.7 -0.51  0.19 -1.06     3.48  0
[1] " "
[1] "deltaMinus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.55 0.04  -0.53   -0.55 0.02 -0.76 -0.51  0.25 -1.28     1.87  0
[1] " "
[1] "deltaMinus[5,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.55 0.02  -0.55   -0.55 0.01 -0.64 -0.51  0.13 -0.52     1.81  0
[1] " "
[1] "deltaMinus[6,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.58 0.03  -0.57   -0.58 0.02 -0.71 -0.51   0.2 -0.57     1.73  0
[1] " "
[1] "deltaMinus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.54 0.01  -0.54   -0.54 0.01 -0.56 -0.51  0.05 0.41     0.39  0
[1] " "
[1] "deltaMinus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad   min   max range skew kurtosis se
X1    1 342 -0.5 0.01   -0.5    -0.5   0 -0.51 -0.41   0.1 4.38    29.07  0
[1] " "
[1] "deltaMinus[9,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.53 0.01  -0.53   -0.53 0.01 -0.56 -0.51  0.05 0.33     0.52  0
[1] " "
[1] "deltaMinus[10,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.56 0.02  -0.56   -0.56 0.02 -0.66 -0.51  0.14 -0.42     1.53  0
[1] " "
[1] "deltaMinus[11,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.59 0.03  -0.59   -0.59 0.03 -0.73 -0.52  0.21 -0.54     1.79  0
[1] " "

This works, but there is not a lot of variance in the alpha paramter when described by mode mean 0.49; sd = 0.06. Compared to defined by mean where mean is 0.54 and sd is 0.26.

However there is a lot of variation in the beta paramter (mean -7.21, sd = 134.74)

Create BIC from log likelihood

## extract log likelihood
flare_loglike <- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
#calculate BIC
FLARe_bic_best<-bic(ntrials,-colMeans(flare_loglike),2) #number of parameters in that model e.g. 4)
## mean BIC as model comparisons tool:
print("Mean Bayesian information criterion for model")
[1] "Mean Bayesian information criterion for model"
mean(FLARe_bic_best)
[1] 101.854

Add to bar plot

# 
 mod_comp <- rbind(na.omit(mod_comp),c("Mode 1 beta",mean(FLARe_bic)))
# 
plot <- ggplot(na.omit(mod_comp),aes(x=model,y=BIC)) +
  geom_bar(stat = "identity") +
  coord_flip()
#
show(plot)

Model 5: RL mean defined,two beta

mean sd RL model with beta per stimulus

RL model adding a beta per stimulus to Alex’s model

## decide testing rate (min,med,max or off)
testing('min')
## set up run
stanname='beta_meansd_2beta_RL.stan'
stanfile <- file.path(scriptdir, stanname)
flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus= t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled),cdf_scale=cdf_scale)
flare_fit_m2 <- stan(file = stanfile, data = flare_data, iter=chain_iter,warmup = warm_up, chains = chain_n) #add working dir?
hash mismatch so recompiling; make sure Stan code ends with a blank line

SAMPLING FOR MODEL 'beta_meansd_2beta_RL' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.011123 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 111.23 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: WARNING: There aren't enough warmup iterations to fit the
Chain 1:          three stages of adaptation as currently configured.
Chain 1:          Reducing each adaptation stage to 15%/75%/10% of
Chain 1:          the given number of warmup iterations:
Chain 1:            init_buffer = 15
Chain 1:            adapt_window = 75
Chain 1:            term_buffer = 10
Chain 1: 
Chain 1: Iteration:   1 / 400 [  0%]  (Warmup)
Chain 1: Iteration:  40 / 400 [ 10%]  (Warmup)
Chain 1: Iteration:  80 / 400 [ 20%]  (Warmup)
Chain 1: Iteration: 101 / 400 [ 25%]  (Sampling)
Chain 1: Iteration: 140 / 400 [ 35%]  (Sampling)
Chain 1: Iteration: 180 / 400 [ 45%]  (Sampling)
Chain 1: Iteration: 220 / 400 [ 55%]  (Sampling)
Chain 1: Iteration: 260 / 400 [ 65%]  (Sampling)
Chain 1: Iteration: 300 / 400 [ 75%]  (Sampling)
Chain 1: Iteration: 340 / 400 [ 85%]  (Sampling)
Chain 1: Iteration: 380 / 400 [ 95%]  (Sampling)
Chain 1: Iteration: 400 / 400 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 49.4421 seconds (Warm-up)
Chain 1:                111.635 seconds (Sampling)
Chain 1:                161.077 seconds (Total)
Chain 1: 
save(flare_fit_m2, file=file.path(datadir,'flare_fit_2betaMean'))
traceplot(flare_fit_m2,'lp__')

# extract fit data
summary_flare_m2 <- summary(flare_fit_m2)
## get some basic output descriptions printed to screen
out_describe(summary_flare_m2)
[1] "400 iterations  on 1 chains. "
[1] "Estimated 99 Free paramaters per person"
[1] " "
[1] "Average Rhat"
[1] 1
[1] "alpha[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.08 0.02   0.08    0.08 0.01 0.01 0.16  0.15 -0.13     2.02  0
[1] " "
[1] "beta[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.22 0.08   0.22    0.22 0.08 0.02 0.38  0.37 -0.27    -0.37  0
[1] " "
[1] "beta[172,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 342 0.21 0.07   0.22    0.21 0.07 0.02 0.4  0.38 -0.22    -0.34  0
[1] " "
[1] "first[1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5   0 0.45 0.53  0.07 -1.58     5.53  0
[1] " "
[1] "loglik[1]"
[1] " "
   vars   n   mean   sd median trimmed  mad    min    max range skew kurtosis   se
X1    1 342 -47.06 5.15 -48.11  -47.56 5.46 -54.23 -32.71 21.51 0.73    -0.29 0.28
[1] " "
[1] "shape1_Plus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.66 0.38   0.56    0.59 0.15 0.36 3.64  3.28 3.85    19.83 0.02
[1] " "
[1] "shape1_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.7 0.39    0.6    0.62 0.17 0.39 3.87  3.49 3.88    20.49 0.02
[1] " "
[1] "shape1_Plus[3,1]"
[1] " "
   vars   n mean  sd median trimmed  mad min max range skew kurtosis   se
X1    1 342 0.73 0.4   0.62    0.65 0.17 0.4   4   3.6 3.88    20.63 0.02
[1] " "
[1] "shape1_Plus[4,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.71 0.4    0.6    0.63 0.16 0.38 3.79  3.41 3.78       19 0.02
[1] " "
[1] "shape1_Plus[5,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.72 0.4   0.61    0.64 0.17 0.39 3.97  3.58 3.88    20.51 0.02
[1] " "
[1] "shape1_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.74 0.41   0.63    0.66 0.17 0.4 4.05  3.64 3.87    20.41 0.02
[1] " "
[1] "shape1_Plus[7,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.71 0.4    0.6    0.63 0.17 0.39 3.89   3.5 3.86    20.07 0.02
[1] " "
[1] "shape1_Plus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.66 0.38   0.55    0.58 0.15 0.36 3.6  3.24  3.8    18.95 0.02
[1] " "
[1] "shape1_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.71 0.39    0.6    0.63 0.16 0.39 3.86  3.47 3.84    19.86 0.02
[1] " "
[1] "shape1_Plus[10,1]"
[1] " "
   vars   n mean  sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.73 0.4   0.62    0.65 0.17 0.4 4.01  3.61 3.86    20.21 0.02
[1] " "
[1] "shape1_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.74 0.41   0.63    0.66 0.17 0.41 4.07  3.66 3.85    20.12 0.02
[1] " "
[1] "shape1_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.75 0.42   0.63    0.66 0.17 0.41 4.06  3.65 3.83    19.68 0.02
[1] " "
[1] "shape1_Minus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.06 1.01   0.76    0.85 0.25 0.42 10.76 10.35 5.16    35.09 0.05
[1] " "
[1] "shape1_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.13 1.05   0.82    0.91 0.26 0.45 11.04 10.59 4.96    32.55 0.06
[1] " "
[1] "shape1_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.17 1.08   0.85    0.94 0.27 0.47 11.27  10.8 4.91     31.9 0.06
[1] " "
[1] "shape1_Minus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.15 1.08   0.82    0.92 0.26 0.44 11.45 11.01 5.09    34.43 0.06
[1] " "
[1] "shape1_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.16 1.08   0.84    0.93 0.28 0.47 11.21 10.74 4.92    31.98 0.06
[1] " "
[1] "shape1_Minus[6,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.19 1.1   0.86    0.96 0.28 0.48 11.41 10.93 4.91    31.84 0.06
[1] " "
[1] "shape1_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.14 1.06   0.82    0.91 0.28 0.46 11.15  10.7 4.99     32.9 0.06
[1] " "
[1] "shape1_Minus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.05 1.02   0.75    0.84 0.26 0.41 10.86 10.45 5.25    36.19 0.05
[1] " "
[1] "shape1_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.13 1.06   0.82    0.91 0.27 0.45 11.13 10.67 4.99     32.9 0.06
[1] " "
[1] "shape1_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.18 1.09   0.86    0.95 0.28 0.47 11.34 10.87 4.91    31.73 0.06
[1] " "
[1] "shape1_Minus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342  1.2 1.11   0.87    0.96 0.29 0.48 11.52 11.04 4.92    31.92 0.06
[1] " "
[1] "shape1_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.19 1.11   0.87    0.96 0.29 0.47 11.65 11.17    5    32.91 0.06
[1] " "
[1] "shape2_Plus[1,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.68 0.4   0.56     0.6 0.15 0.36 3.4  3.04 3.72    17.35 0.02
[1] " "
[1] "shape2_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.63 0.39   0.51    0.55 0.14 0.32 3.37  3.05 3.72    17.16 0.02
[1] " "
[1] "shape2_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.58 0.38   0.46     0.5 0.13 0.28 3.34  3.06 3.75    17.38 0.02
[1] " "
[1] "shape2_Plus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.59 0.39   0.48    0.52 0.16 0.25 3.31  3.07 3.75    17.87 0.02
[1] " "
[1] "shape2_Plus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342  0.6 0.38   0.49    0.52 0.14 0.3 3.34  3.04 3.74    17.34 0.02
[1] " "
[1] "shape2_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.55 0.37   0.44    0.47 0.13 0.27 3.31  3.04 3.78    17.81 0.02
[1] " "
[1] "shape2_Plus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.62 0.38   0.51    0.55 0.14 0.32 3.34  3.02 3.75    17.49 0.02
[1] " "
[1] "shape2_Plus[8,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.68 0.4   0.56     0.6 0.16 0.36 3.42  3.06 3.76    17.82 0.02
[1] " "
[1] "shape2_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.63 0.38   0.52    0.55 0.14 0.33 3.34  3.01 3.76    17.58 0.02
[1] " "
[1] "shape2_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.58 0.37   0.46     0.5 0.13 0.29 3.31  3.02 3.78    17.75 0.02
[1] " "
[1] "shape2_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.53 0.36   0.42    0.45 0.13 0.25 3.28  3.03 3.83    18.34 0.02
[1] " "
[1] "shape2_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.49 0.35   0.38    0.41 0.12 0.22 3.25  3.03  3.9    19.26 0.02
[1] " "
[1] "shape2_Minus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 1.07 1.03   0.77    0.85 0.26 0.42  10  9.58 4.91    30.82 0.06
[1] " "
[1] "shape2_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.98 0.99   0.69    0.77 0.24 0.37 9.67   9.3 5.19    34.21 0.05
[1] " "
[1] "shape2_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.89 0.95   0.61    0.69 0.22 0.32 9.33  9.01 5.47    37.58 0.05
[1] " "
[1] "shape2_Minus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.92 0.96   0.64    0.73 0.24 0.26 8.99  8.73 5.02    31.99 0.05
[1] " "
[1] "shape2_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.93 0.96   0.65    0.73 0.22 0.34 9.44   9.1 5.31    35.73 0.05
[1] " "
[1] "shape2_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 342 0.84 0.92   0.58    0.66 0.21 0.3 9.1   8.8 5.58     39.1 0.05
[1] " "
[1] "shape2_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.98 0.98   0.69    0.78 0.23 0.37 9.53  9.16 5.12    33.39 0.05
[1] " "
[1] "shape2_Minus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 1.08 1.03   0.77    0.86 0.25 0.42 9.91  9.49 4.84     29.9 0.06
[1] " "
[1] "shape2_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.99 0.98    0.7    0.78 0.23 0.37 9.57   9.2 5.11    33.26 0.05
[1] " "
[1] "shape2_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.89 0.94   0.62     0.7 0.21 0.32 9.23  8.91 5.41    36.99 0.05
[1] " "
[1] "shape2_Minus[11,1]"
[1] " "
   vars   n mean  sd median trimmed mad  min max range skew kurtosis   se
X1    1 342 0.81 0.9   0.55    0.62 0.2 0.28 8.9  8.62 5.68    40.34 0.05
[1] " "
[1] "shape2_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.73 0.87   0.49    0.56 0.19 0.23 8.57  8.34  5.9    43.17 0.05
[1] " "
[1] "VPlus[1,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5   0 0.45 0.53  0.07 -1.58     5.53  0
[1] " "
[1] "VPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 342 0.54 0.02   0.54    0.54 0.01 0.46 0.6  0.14 -1.24     4.26  0
[1] " "
[1] "VPlus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.57 0.03   0.57    0.57 0.02 0.46 0.66   0.2 -1.02     3.53  0
[1] " "
[1] "VPlus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.56 0.04   0.53    0.56 0.04 0.47 0.69  0.22 0.37     -0.9  0
[1] " "
[1] "VPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.55 0.02   0.56    0.56 0.01 0.46 0.62  0.16 -1.26     4.17  0
[1] " "
[1] "VPlus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.59 0.03   0.59    0.59 0.02 0.47 0.68  0.21 -1.1     3.63  0
[1] " "
[1] "VPlus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.01   0.54    0.54 0.01 0.46 0.57  0.11 -2.38     7.98  0
[1] " "
[1] "VPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range  skew kurtosis se
X1    1 342 0.49 0.01    0.5     0.5   0 0.46 0.52  0.06 -1.48      5.2  0
[1] " "
[1] "VPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.01   0.54    0.54 0.01 0.46 0.57   0.1 -2.49      8.6  0
[1] " "
[1] "VPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.57 0.02   0.57    0.57 0.01 0.47 0.63  0.17 -1.6     5.05  0
[1] " "
[1] "VPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342  0.6 0.03    0.6     0.6 0.02 0.47 0.69  0.22 -1.31     4.13  0
[1] " "
[1] "VPlus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.63 0.04   0.63    0.63 0.02 0.48 0.73  0.26 -1.22     3.82  0
[1] " "
[1] "VMinus[1,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5   0 0.45 0.53  0.07 -1.58     5.53  0
[1] " "
[1] "VMinus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 342 0.54 0.02   0.54    0.54 0.01 0.46 0.6  0.14 -1.24     4.26  0
[1] " "
[1] "VMinus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.57 0.03   0.57    0.57 0.02 0.46 0.66   0.2 -1.02     3.53  0
[1] " "
[1] "VMinus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.56 0.04   0.53    0.56 0.04 0.47 0.69  0.22 0.37     -0.9  0
[1] " "
[1] "VMinus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.55 0.02   0.56    0.56 0.01 0.46 0.62  0.16 -1.26     4.17  0
[1] " "
[1] "VMinus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.59 0.03   0.59    0.59 0.02 0.47 0.68  0.21 -1.1     3.63  0
[1] " "
[1] "VMinus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.01   0.54    0.54 0.01 0.46 0.57  0.11 -2.38     7.98  0
[1] " "
[1] "VMinus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range  skew kurtosis se
X1    1 342 0.49 0.01    0.5     0.5   0 0.46 0.52  0.06 -1.48      5.2  0
[1] " "
[1] "VMinus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.01   0.54    0.54 0.01 0.46 0.57   0.1 -2.49      8.6  0
[1] " "
[1] "VMinus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.57 0.02   0.57    0.57 0.01 0.47 0.63  0.17 -1.6     5.05  0
[1] " "
[1] "VMinus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342  0.6 0.03    0.6     0.6 0.02 0.47 0.69  0.22 -1.31     4.13  0
[1] " "
[1] "VMinus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.63 0.04   0.63    0.63 0.02 0.48 0.73  0.26 -1.22     3.82  0
[1] " "
[1] "deltaPlus[1,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5   0 0.47 0.55  0.07 1.58     5.53  0
[1] " "
[1] "deltaPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis se
X1    1 342 0.46 0.02   0.46    0.46 0.01 0.4 0.54  0.14 1.24     4.26  0
[1] " "
[1] "deltaPlus[3,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min  max range skew kurtosis   se
X1    1 342 -0.08 0.51   -0.5   -0.09 0.18 -0.66 0.54   1.2 0.06    -1.99 0.03
[1] " "
[1] "deltaPlus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min  max range  skew kurtosis   se
X1    1 342 -0.04 0.54   0.46   -0.04 0.07 -0.69 0.53  1.22 -0.06    -1.99 0.03
[1] " "
[1] "deltaPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.45 0.02   0.44    0.44 0.01 0.38 0.54  0.16 1.26     4.17  0
[1] " "
[1] "deltaPlus[6,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.59 0.03  -0.59   -0.59 0.02 -0.68 -0.47  0.21  1.1     3.63  0
[1] " "
[1] "deltaPlus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.54 0.01  -0.54   -0.54 0.01 -0.57 -0.46  0.11 2.38     7.98  0
[1] " "
[1] "deltaPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis se
X1    1 342 0.51 0.01    0.5     0.5   0 0.48 0.54  0.06 1.48      5.2  0
[1] " "
[1] "deltaPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.46 0.01   0.46    0.46 0.01 0.43 0.54   0.1 2.49      8.6  0
[1] " "
[1] "deltaPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.43 0.02   0.43    0.43 0.01 0.37 0.53  0.17  1.6     5.05  0
[1] " "
[1] "deltaPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342  0.4 0.03    0.4     0.4 0.02 0.31 0.53  0.22 1.31     4.13  0
[1] " "
[1] "deltaMinus[1,1]"
[1] " "
   vars   n mean   sd median trimmed mad   min   max range skew kurtosis se
X1    1 342 -0.5 0.01   -0.5    -0.5   0 -0.53 -0.45  0.07 1.58     5.53  0
[1] " "
[1] "deltaMinus[2,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad  min   max range skew kurtosis se
X1    1 342 -0.54 0.02  -0.54   -0.54 0.01 -0.6 -0.46  0.14 1.24     4.26  0
[1] " "
[1] "deltaMinus[3,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.57 0.03  -0.57   -0.57 0.02 -0.66 -0.46   0.2 1.02     3.53  0
[1] " "
[1] "deltaMinus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.56 0.04  -0.53   -0.56 0.04 -0.69 -0.47  0.22 -0.37     -0.9  0
[1] " "
[1] "deltaMinus[5,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.55 0.02  -0.56   -0.56 0.01 -0.62 -0.46  0.16 1.26     4.17  0
[1] " "
[1] "deltaMinus[6,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.59 0.03  -0.59   -0.59 0.02 -0.68 -0.47  0.21  1.1     3.63  0
[1] " "
[1] "deltaMinus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.54 0.01  -0.54   -0.54 0.01 -0.57 -0.46  0.11 2.38     7.98  0
[1] " "
[1] "deltaMinus[8,1]"
[1] " "
   vars   n  mean   sd median trimmed mad   min   max range skew kurtosis se
X1    1 342 -0.49 0.01   -0.5    -0.5   0 -0.52 -0.46  0.06 1.48      5.2  0
[1] " "
[1] "deltaMinus[9,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.54 0.01  -0.54   -0.54 0.01 -0.57 -0.46   0.1 2.49      8.6  0
[1] " "
[1] "deltaMinus[10,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.57 0.02  -0.57   -0.57 0.01 -0.63 -0.47  0.17  1.6     5.05  0
[1] " "
[1] "deltaMinus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.6 0.03   -0.6    -0.6 0.02 -0.69 -0.47  0.22 1.31     4.13  0
[1] " "

Create BIC from log likelihood

## extract log likelihood
flare_loglike_m2 <- extract_log_lik(flare_fit_m2, parameter_name = "loglik", merge_chains = TRUE)
#calculate BIC
FLARe_bic_m2 <- bic(ntrials,-colMeans(flare_loglike_m2),3) #number of parameters in that model e.g. 4)
# mean for all participants
mean(FLARe_bic_m2)
[1] 101.5727

Add to bar plot

mod_comp <- rbind(mod_comp,c("Means 2 beta",mean(FLARe_bic)))
plot <- ggplot(na.omit(mod_comp),aes(x=model,y=BIC)) +
  geom_bar(stat = "identity") +
  coord_flip()
show(plot)

Model 6: RL mode defined,two beta

mode sd RL model with beta per stimulus

RL model adding a beta per stimuli to model defining the beta shape using the mode instead of the mean. This definitely makes more sense as we assume that they will have different levels of uncertainty about each.

## decide testing rate (min,med,max or off)
testing('min')
## set up run
stanname='beta_mode_2beta_RL_2.stan'
stanfile <- file.path(scriptdir, stanname)
flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus= t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled))
flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?

SAMPLING FOR MODEL 'beta_mode_2beta_RL_2' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.008516 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 85.16 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: Iteration:   1 / 400 [  0%]  (Warmup)
Chain 1: Iteration:  40 / 400 [ 10%]  (Warmup)
Chain 1: Iteration:  80 / 400 [ 20%]  (Warmup)
Chain 1: Iteration: 120 / 400 [ 30%]  (Warmup)
Chain 1: Iteration: 160 / 400 [ 40%]  (Warmup)
Chain 1: Iteration: 200 / 400 [ 50%]  (Warmup)
Chain 1: Iteration: 201 / 400 [ 50%]  (Sampling)
Chain 1: Iteration: 240 / 400 [ 60%]  (Sampling)
Chain 1: Iteration: 280 / 400 [ 70%]  (Sampling)
Chain 1: Iteration: 320 / 400 [ 80%]  (Sampling)
Chain 1: Iteration: 360 / 400 [ 90%]  (Sampling)
Chain 1: Iteration: 400 / 400 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 56.1107 seconds (Warm-up)
Chain 1:                33.7442 seconds (Sampling)
Chain 1:                89.8549 seconds (Total)
Chain 1: 
save(flare_fit, file=file.path(datadir,'flare_fit_test'))
traceplot(flare_fit,'lp__')

# extract fit data
summary_flare <- summary(flare_fit)
# extract model summary data
#flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
## get some basic output descriptions printed to screen
out_describe(summary_flare)
[1] "400 iterations  on 1 chains. "
[1] "Estimated 98 Free paramaters per person"
[1] " "
[1] "Average Rhat"
[1] 0.9591849
[1] "alpha[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.09 0.03   0.09    0.09 0.02 0.01 0.25  0.25 0.44     2.56  0
[1] " "
[1] "beta[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 2.09 1.96   1.55     1.7 0.59 0.85 24.58 23.73    6    54.36 0.11
[1] " "
[1] "beta[172,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 2.13 2.08   1.58    1.73 0.57 0.84 22.87 22.02  5.8    43.88 0.11
[1] " "
[1] "loglik[1]"
[1] " "
   vars   n  mean   sd median trimmed  mad    min    max range skew kurtosis   se
X1    1 342 -48.5 4.41 -49.59  -48.98 4.47 -54.47 -34.58 19.89 0.84    -0.01 0.24
[1] " "
[1] "shape1_Plus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.79 0.47   0.65    0.69 0.18 0.42 4.16  3.74 3.64    16.93 0.03
[1] " "
[1] "shape1_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.85 0.49   0.71    0.75 0.21 0.46 4.58  4.12 3.74    18.47 0.03
[1] " "
[1] "shape1_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.9 0.51   0.76     0.8 0.22 0.49 4.95  4.46 3.83     19.9 0.03
[1] " "
[1] "shape1_Plus[4,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.88 0.5   0.73    0.78 0.21 0.45 4.43  3.98 3.55    16.33 0.03
[1] " "
[1] "shape1_Plus[5,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.87 0.5   0.73    0.77 0.21 0.47 4.82  4.34  3.8    19.37 0.03
[1] " "
[1] "shape1_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.92 0.52   0.78    0.82 0.22 0.5 5.15  4.65 3.88    20.73 0.03
[1] " "
[1] "shape1_Plus[7,1]"
[1] " "
   vars   n mean  sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.85 0.5    0.7    0.75 0.2 0.46 4.61  4.15 3.74    18.33 0.03
[1] " "
[1] "shape1_Plus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.78 0.48   0.64    0.69 0.19 0.41 4.14  3.73 3.61    16.53 0.03
[1] " "
[1] "shape1_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.49    0.7    0.74 0.2 0.46 4.57  4.11 3.72    18.15 0.03
[1] " "
[1] "shape1_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.9 0.51   0.76     0.8 0.21 0.49 4.94  4.45 3.82    19.61 0.03
[1] " "
[1] "shape1_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.94 0.53    0.8    0.84 0.23 0.52 5.27  4.75 3.89    20.91 0.03
[1] " "
[1] "shape1_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.98 0.54   0.85    0.88 0.25 0.54 5.55  5.01 3.96    22.03 0.03
[1] " "
[1] "shape1_Minus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min   max range skew kurtosis   se
X1    1 342 1.33 1.29   0.93    1.05 0.31 0.5 12.29 11.79  4.9    30.83 0.07
[1] " "
[1] "shape1_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.44 1.36   1.02    1.15 0.33 0.55 12.71 12.16  4.7    28.11 0.07
[1] " "
[1] "shape1_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.54 1.43    1.1    1.23 0.36 0.59 13.11 12.52 4.56    26.35 0.08
[1] " "
[1] "shape1_Minus[4,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.49 1.4   1.05     1.2 0.35 0.53 13.48 12.95  4.8    29.77 0.08
[1] " "
[1] "shape1_Minus[5,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 1.49 1.4   1.06    1.19 0.35 0.56  13 12.44 4.65    27.52 0.08
[1] " "
[1] "shape1_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min   max range skew kurtosis   se
X1    1 342 1.58 1.46   1.14    1.27 0.38 0.6 13.38 12.78 4.54       26 0.08
[1] " "
[1] "shape1_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 1.43 1.37   1.01    1.14 0.33 0.54 12.9 12.37 4.78    29.31 0.07
[1] " "
[1] "shape1_Minus[8,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342  1.3 1.3   0.91    1.03 0.32 0.43 12.45 12.02 5.03    32.53 0.07
[1] " "
[1] "shape1_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.43 1.37   1.01    1.14 0.33 0.54 12.87 12.33 4.79    29.36 0.07
[1] " "
[1] "shape1_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.53 1.43   1.09    1.22 0.35 0.58 13.26 12.68 4.63    27.24 0.08
[1] " "
[1] "shape1_Minus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.62 1.49   1.17     1.3 0.38 0.62 13.63 13.01 4.53    25.86 0.08
[1] " "
[1] "shape1_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342 1.69 1.55   1.23    1.36 0.4 0.66 13.98 13.33 4.46    24.94 0.08
[1] " "
[1] "shape2_Plus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.79 0.47   0.65    0.69 0.18 0.42 4.16  3.74 3.64    16.93 0.03
[1] " "
[1] "shape2_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.73 0.45    0.6    0.64 0.17 0.37 3.74  3.37 3.55    15.61 0.02
[1] " "
[1] "shape2_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.68 0.44   0.54    0.59 0.17 0.32 3.46  3.14 3.48    14.75 0.02
[1] " "
[1] "shape2_Plus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 342  0.7 0.45   0.56    0.61 0.19 0.3 3.9   3.6  3.6    16.63 0.02
[1] " "
[1] "shape2_Plus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.7 0.44   0.57    0.61 0.17 0.34 3.51  3.17 3.51    15.11 0.02
[1] " "
[1] "shape2_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.66 0.43   0.53    0.57 0.16 0.3 3.43  3.14 3.46    14.51 0.02
[1] " "
[1] "shape2_Plus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.73 0.45    0.6    0.64 0.17 0.38 3.71  3.34 3.56    15.78 0.02
[1] " "
[1] "shape2_Plus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.8 0.47   0.66     0.7 0.19 0.43 4.19  3.76 3.66    17.25 0.03
[1] " "
[1] "shape2_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.73 0.45    0.6    0.64 0.17 0.38 3.76  3.38 3.57     15.9 0.02
[1] " "
[1] "shape2_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.68 0.44   0.55    0.59 0.16 0.33 3.44  3.11  3.5       15 0.02
[1] " "
[1] "shape2_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.64 0.42    0.5    0.55 0.16 0.28 3.41  3.12 3.45    14.48 0.02
[1] " "
[1] "shape2_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.6 0.41   0.46    0.51 0.15 0.25 3.38  3.13 3.42    14.25 0.02
[1] " "
[1] "shape2_Minus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min   max range skew kurtosis   se
X1    1 342 1.33 1.29   0.93    1.05 0.31 0.5 12.29 11.79  4.9    30.83 0.07
[1] " "
[1] "shape2_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342 1.21 1.23   0.84    0.95 0.3 0.42 11.87 11.45 5.14    33.94 0.07
[1] " "
[1] "shape2_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.11 1.18   0.77    0.87 0.29 0.32 11.47 11.15 5.34    36.53 0.06
[1] " "
[1] "shape2_Minus[4,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 1.16 1.2   0.81    0.91 0.29 0.25 11.1 10.85 4.93    30.99 0.07
[1] " "
[1] "shape2_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min   max range skew kurtosis   se
X1    1 342 1.16 1.19    0.8    0.92 0.28 0.4 11.58 11.18 5.21    34.88 0.06
[1] " "
[1] "shape2_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 1.07 1.15   0.73    0.84 0.27 0.35 11.2 10.85  5.4    37.32 0.06
[1] " "
[1] "shape2_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.22 1.22   0.85    0.96 0.29 0.45 11.67 11.22 5.03    32.57 0.07
[1] " "
[1] "shape2_Minus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342 1.35 1.29   0.94    1.07 0.3 0.51 12.12 11.62 4.78    29.16 0.07
[1] " "
[1] "shape2_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.22 1.22   0.85    0.97 0.29 0.45 11.71 11.26 5.03     32.5 0.07
[1] " "
[1] "shape2_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.12 1.17   0.77    0.88 0.28 0.38 11.32 10.94 5.25    35.41 0.06
[1] " "
[1] "shape2_Minus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 1.03 1.12    0.7     0.8 0.26 0.29 10.95 10.66 5.44    37.75 0.06
[1] " "
[1] "shape2_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.96 1.08   0.65    0.74 0.25 0.22 10.6 10.37 5.59    39.56 0.06
[1] " "
[1] "VPlus[1,1]"
[1] " "
   vars   n mean sd median trimmed mad min max range skew kurtosis se
X1    1 342  0.5  0    0.5     0.5   0 0.5 0.5     0  NaN      NaN  0
[1] " "
[1] "VPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis se
X1    1 342 0.54 0.02   0.54    0.54 0.01 0.5 0.63  0.12 0.44     2.56  0
[1] " "
[1] "VPlus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.58 0.03   0.58    0.58 0.02 0.51 0.72  0.21 0.24     2.04  0
[1] " "
[1] "VPlus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis se
X1    1 342 0.57 0.05   0.53    0.56 0.02 0.5 0.78  0.28 0.79    -0.03  0
[1] " "
[1] "VPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.56 0.02   0.56    0.56 0.02 0.51 0.63  0.12 0.04      1.1  0
[1] " "
[1] "VPlus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342  0.6 0.03    0.6     0.6 0.02 0.51 0.71  0.19 -0.09     1.17  0
[1] " "
[1] "VPlus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.01   0.54    0.54 0.01 0.51 0.56  0.05 -0.97      1.7  0
[1] " "
[1] "VPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.49 0.01   0.49    0.49 0.01 0.38 0.51  0.13 -3.07    20.41  0
[1] " "
[1] "VPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.01   0.54    0.54 0.01 0.51 0.56  0.05 -0.89      1.8  0
[1] " "
[1] "VPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.58 0.02   0.58    0.58 0.02 0.51 0.66  0.15 -0.27      1.5  0
[1] " "
[1] "VPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.61 0.03   0.61    0.61 0.02 0.51 0.74  0.23 -0.21     1.55  0
[1] " "
[1] "VPlus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 342 0.64 0.04   0.64    0.64 0.03 0.52 0.8  0.28 -0.26      1.5  0
[1] " "
[1] "VMinus[1,1]"
[1] " "
   vars   n mean sd median trimmed mad min max range skew kurtosis se
X1    1 342  0.5  0    0.5     0.5   0 0.5 0.5     0  NaN      NaN  0
[1] " "
[1] "VMinus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis se
X1    1 342 0.54 0.02   0.54    0.54 0.01 0.5 0.63  0.12 0.44     2.56  0
[1] " "
[1] "VMinus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.58 0.03   0.58    0.58 0.02 0.51 0.72  0.21 0.24     2.04  0
[1] " "
[1] "VMinus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis se
X1    1 342 0.57 0.05   0.53    0.56 0.02 0.5 0.78  0.28 0.79    -0.03  0
[1] " "
[1] "VMinus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.56 0.02   0.56    0.56 0.02 0.51 0.63  0.12 0.04      1.1  0
[1] " "
[1] "VMinus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342  0.6 0.03    0.6     0.6 0.02 0.51 0.71  0.19 -0.09     1.17  0
[1] " "
[1] "VMinus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.01   0.54    0.54 0.01 0.51 0.56  0.05 -0.97      1.7  0
[1] " "
[1] "VMinus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.49 0.01   0.49    0.49 0.01 0.38 0.51  0.13 -3.07    20.41  0
[1] " "
[1] "VMinus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.01   0.54    0.54 0.01 0.51 0.56  0.05 -0.89      1.8  0
[1] " "
[1] "VMinus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.58 0.02   0.58    0.58 0.02 0.51 0.66  0.15 -0.27      1.5  0
[1] " "
[1] "VMinus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.61 0.03   0.61    0.61 0.02 0.51 0.74  0.23 -0.21     1.55  0
[1] " "
[1] "VMinus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 342 0.64 0.04   0.64    0.64 0.03 0.52 0.8  0.28 -0.26      1.5  0
[1] " "
[1] "deltaPlus[1,1]"
[1] " "
   vars   n mean sd median trimmed mad min max range skew kurtosis se
X1    1 342  0.5  0    0.5     0.5   0 0.5 0.5     0  NaN      NaN  0
[1] " "
[1] "deltaPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 342 0.46 0.02   0.46    0.46 0.01 0.37 0.5  0.12 -0.44     2.56  0
[1] " "
[1] "deltaPlus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min  max range skew kurtosis   se
X1    1 342 -0.1 0.51  -0.52    -0.1 0.18 -0.68 0.49  1.17 0.06    -1.99 0.03
[1] " "
[1] "deltaPlus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min max range  skew kurtosis   se
X1    1 342 -0.05 0.54   0.46   -0.04 0.04 -0.78 0.5  1.28 -0.06    -1.99 0.03
[1] " "
[1] "deltaPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.44 0.02   0.44    0.44 0.02 0.37 0.49  0.12 -0.04      1.1  0
[1] " "
[1] "deltaPlus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.6 0.03   -0.6    -0.6 0.02 -0.71 -0.51  0.19 0.09     1.17  0
[1] " "
[1] "deltaPlus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.54 0.01  -0.54   -0.54 0.01 -0.56 -0.51  0.05 0.97      1.7  0
[1] " "
[1] "deltaPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.51 0.01   0.51    0.51 0.01 0.49 0.62  0.13 3.07    20.41  0
[1] " "
[1] "deltaPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.46 0.01   0.46    0.46 0.01 0.44 0.49  0.05 0.89      1.8  0
[1] " "
[1] "deltaPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.42 0.02   0.42    0.42 0.02 0.34 0.49  0.15 0.27      1.5  0
[1] " "
[1] "deltaPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.39 0.03   0.39    0.39 0.02 0.26 0.49  0.23 0.21     1.55  0
[1] " "
[1] "deltaMinus[1,1]"
[1] " "
   vars   n mean sd median trimmed mad  min  max range skew kurtosis se
X1    1 342 -0.5  0   -0.5    -0.5   0 -0.5 -0.5     0  NaN      NaN  0
[1] " "
[1] "deltaMinus[2,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min  max range  skew kurtosis se
X1    1 342 -0.54 0.02  -0.54   -0.54 0.01 -0.63 -0.5  0.12 -0.44     2.56  0
[1] " "
[1] "deltaMinus[3,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.58 0.03  -0.58   -0.58 0.02 -0.72 -0.51  0.21 -0.24     2.04  0
[1] " "
[1] "deltaMinus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min  max range  skew kurtosis se
X1    1 342 -0.57 0.05  -0.53   -0.56 0.02 -0.78 -0.5  0.28 -0.79    -0.03  0
[1] " "
[1] "deltaMinus[5,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.56 0.02  -0.56   -0.56 0.02 -0.63 -0.51  0.12 -0.04      1.1  0
[1] " "
[1] "deltaMinus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.6 0.03   -0.6    -0.6 0.02 -0.71 -0.51  0.19 0.09     1.17  0
[1] " "
[1] "deltaMinus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.54 0.01  -0.54   -0.54 0.01 -0.56 -0.51  0.05 0.97      1.7  0
[1] " "
[1] "deltaMinus[8,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.49 0.01  -0.49   -0.49 0.01 -0.51 -0.38  0.13 3.07    20.41  0
[1] " "
[1] "deltaMinus[9,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.54 0.01  -0.54   -0.54 0.01 -0.56 -0.51  0.05 0.89      1.8  0
[1] " "
[1] "deltaMinus[10,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.58 0.02  -0.58   -0.58 0.02 -0.66 -0.51  0.15 0.27      1.5  0
[1] " "
[1] "deltaMinus[11,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.61 0.03  -0.61   -0.61 0.02 -0.74 -0.51  0.23 0.21     1.55  0
[1] " "

The alpha parameter variance is normal (mean 0.4 and sd 0.12). Beta is much more bounded now though (combined across both stimuli mean 0.79, sd=1.6) over 4000 iterations on 4 chains.

Create BIC from log likelihood

## extract log likelihood
flare_loglike <- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
#calculate BIC
FLARe_bic<-bic(ntrials,-colMeans(flare_loglike),2) #number of parameters in that model e.g. 4)
## mean BIC as model comparisons tool:
print("Mean Bayesian information criterion for model")
[1] "Mean Bayesian information criterion for model"
mean(FLARe_bic)
[1] 101.9691

Add to bar plot

mod_comp <- rbind(na.omit(mod_comp),c("Mode 2 beta",mean(FLARe_bic)))
plot <- ggplot(mod_comp,aes(x=model,y=BIC)) +
  geom_bar(stat = "identity") +
  coord_flip()
show(plot)

Model 7: RL mean defined, no beta

mean sd RL model with no beta (only alpha)

The beta doesnt work as well for the CS+ stimulus, need to check if this paramter adds anything to the model - drop it from our best mean model and see how this changes the fit.

## decide testing rate (min,med,max or off)
testing('min')
## set up run
stanname='beta_meansd_RL_NoBeta.stan'
stanfile <- file.path(scriptdir, stanname)
flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus= t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled))
flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?
recompiling to avoid crashing R session

SAMPLING FOR MODEL 'beta_meansd_RL_NoBeta' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.138653 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 1386.53 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: Iteration:   1 / 400 [  0%]  (Warmup)
Chain 1: Iteration:  40 / 400 [ 10%]  (Warmup)
Chain 1: Iteration:  80 / 400 [ 20%]  (Warmup)
Chain 1: Iteration: 120 / 400 [ 30%]  (Warmup)
Chain 1: Iteration: 160 / 400 [ 40%]  (Warmup)
Chain 1: Iteration: 200 / 400 [ 50%]  (Warmup)
Chain 1: Iteration: 201 / 400 [ 50%]  (Sampling)
Chain 1: Iteration: 240 / 400 [ 60%]  (Sampling)
Chain 1: Iteration: 280 / 400 [ 70%]  (Sampling)
Chain 1: Iteration: 320 / 400 [ 80%]  (Sampling)
Chain 1: Iteration: 360 / 400 [ 90%]  (Sampling)
Chain 1: Iteration: 400 / 400 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 11481.6 seconds (Warm-up)
Chain 1:                12066.7 seconds (Sampling)
Chain 1:                23548.4 seconds (Total)
Chain 1: 

Create BIC from log likelihood

Add to bar plot

Generate and recover

Here I test whether the model is working well by seeing if I can use the parameters we’ve estimated to try and generate our existing rating data and then recover similar paramters again.

I will do this for the best fitting model (mean defined beta distribution with a variance estimate per person for eahc stimulus) This is the model where we treat the iterarted ratings as if they are ‘expected’ values and use this as shape 1 paramter for our beta distribution at each trial. We have allowed a beta (or uncertainty) paramter per stimulus.

A good model will have a) a good correlation between real data and the data generated and b) a good correlation between the parameter estimates from the real and generated data.

We basically want to replicate our stan script, but inatead of estimating paratmers, we want to assume that we know what the parameters are (i.e. use the alpha and beta’s we have estimated previously).

update: turns out single beta is the best fitting model when I correct my BIC function to include the negative log likelihood. So will also generate and recover for this model and use this as the comparator.

Mean 1 beta

Generate

Make alpha / beta datasets p/p

Use the summary of the stan model to extract the different paramters we want to try to use to recreate our data.

Initialise empty datasets to hold the predicted ratings
Simulate ratings

Use our extracted paramters in place of estimating the same. Use the stan syntax

Populate our vplus and delta frames

use the alpha paramters we’ve extracted (alpha_est) d == delta (precdiction error) v == value (i.e. value for each stimulus)

for (t in 1:ntrials){
  shape1_Plus[t,p] = VPlus[t,p] * ((VPlus[t,p] * (1-VPlus[t,p])) / beta[p,1]);
  shape1_Minus[t,p] = VMinus[t,p] * ((VMinus[t,p] * (1-VMinus[t,p])) / beta[p,2]);
  shape2_Plus[t,p] = (1-VPlus[t,p]) * ((VPlus[t,p] * (1-VPlus[t,p])) / beta[p,1]);
  shape2_Minus[t,p] = (1-VMinus[t,p]) * ((VMinus[t,p] * (1-VMinus[t,p])) / beta[p,2]);

  ratingsPlus[t,p] ~ beta(shape1_Plus[t,p],shape2_Plus[t,p]);
  ratingsMinus[t,p] ~ beta(shape1_Minus[t,p],shape2_Minus[t,p]);
}

} }

populate beta parameter shape frames

Use the new v frames and beta parameters.

Shape 1 and 2 are sufficient paramters for the beta distribution

Estimate ratings

trying to use pbeta here (derives the distribution function givemn a set of probabilities)

For now, setting probabilities between 0 and 1 and taking the average…

Rescale simulated ratings

You could argue that these should match the discrete scale nature of the original ratings. We effectively undid this in our script. The following will enable this.

HOWEVER: we are redcucing variance massively this way, so think it might be better to leave the recovered ratings unscales….

So - the following discrete values exist in our rescaled ratings:

Will make it that anything that falls 0.05555556 above or below one of these values is set to this median point. Note that this is our cdf_scale factor that we used in the script to capture the full area under the curve for each segment of the distribution represented by the discrete ratings of 1-9.

Write the function to rescale

apply it to the simulated rating frames.

(unhash to run this)

Correlate actual ratings with simulated ratings

use the simulated ratings per person that we have derived using our paramters and see how well they align with the real ratings…

Only showing the diaganols from corr.test package here to get the important t1 x t1 etc values.

this will be using either rating_est files (rating_est_plus;rating_est_minus) or the est_scaled files (est_minus_scaled; est_plus_scaled) depending on whether we opt to return scaling or no

Recover

Here we are seeing if we can recover the same estimates using the simulated ratings. Basically run stan but using the estimated ratings instead of the real ones. See if we get the same alpha / beta paramters.

We might decide to use the rescaled estimates here to be more comparable…

run stan model

RL model adding a beta per stimulus to Alex’s model

Make alpha / beta datasets p/p

Use the summary of the stan model to extract the different paramters we want to try to use to recreate our data.

Correlate actual ratings with simulated ratings

use the simulated ratings per person that we have derived using our paramters and see how well they align with the real ratings…

Only showing the diaganols from corr.test package here to get the important t1 x t1 etc values.

Mean 2 beta

Generate

Make alpha / beta datasets p/p

Use the summary of the stan model to extract the different paramters we want to try to use to recreate our data.

Initialise empty datasets to hold the predicted ratings
Simulate ratings

Use our extracted paramters in place of estimating the same. Use the stan syntax

Populate our vplus and delta frames

use the alpha paramters we’ve extracted (alpha_est) d == delta (precdiction error) v == value (i.e. value for each stimulus)

for (t in 1:ntrials){
  shape1_Plus[t,p] = VPlus[t,p] * ((VPlus[t,p] * (1-VPlus[t,p])) / beta[p,1]);
  shape1_Minus[t,p] = VMinus[t,p] * ((VMinus[t,p] * (1-VMinus[t,p])) / beta[p,2]);
  shape2_Plus[t,p] = (1-VPlus[t,p]) * ((VPlus[t,p] * (1-VPlus[t,p])) / beta[p,1]);
  shape2_Minus[t,p] = (1-VMinus[t,p]) * ((VMinus[t,p] * (1-VMinus[t,p])) / beta[p,2]);

  ratingsPlus[t,p] ~ beta(shape1_Plus[t,p],shape2_Plus[t,p]);
  ratingsMinus[t,p] ~ beta(shape1_Minus[t,p],shape2_Minus[t,p]);
}

} }

populate beta paramter shape frames

Use the new v frames and beta parameters.

Shape 1 and 2 are sufficient paramters for the beta distribution

Estimate ratings

trying to use pbeta here (derives the distribution function givemn a set of probabilities)

For now, setting probabilities between 0 and 1 and taking the average…

Correlate actual ratings with simulated ratings

use the simulated ratings per person that we have derived using our paramters and see how well they align with the real ratings…

Only showing the diaganols from corr.test package here to get the important t1 x t1 etc values.

Recover

Here we are seeing if we can recover the same estimates using the simulated ratings. Basically run stan but using the estimated ratings instead of the real ones. See if we get the same alpha / beta paramters.

rescale the estimated ratings

rescale the 1-9 expectancy values to be on a 0-1 scale.

stan cannot deal with the extreme limit of the beta, so make the rescaled limits just above 0 and below one

Note that when a value had to be imputed as it was missing it will not be an integer. Thus the function needs to allow for ranges between values.

run stan model

RL model adding a beta per stimulus to Alex’s model

Make alpha / beta datasets p/p

Use the summary of the stan model to extract the different paramters we want to try to use to recreate our data.

Correlate actual ratings with simulated ratings

use the simulated ratings per person that we have derived using our paramters and see how well they align with the real ratings…

Only showing the diaganols from corr.test package here to get the important t1 x t1 etc values.

Expanding on the best base model

Potentially interesting paramters to add to best fit model

Model 8: Punishment sensitivity

How aversive they find the scream reinforcement. Modelling this on the loss aversion paramter in Charpentier et al (see the last page before references),

This will be a single parameter per person, and represents how much the scream influences their ratings.

Based on the paper, will try the following to model this in stan by including it in our value calcs for the CS+ and CS- respectively. we will do this by letting it influence how much their prediction error changes based on whether a scream occurred or not. The prediction error is later used to change the value rating per stimulus

\[d(stimulus,trial) = scream*\lambda-v(stimulus,trial-1)\]

where \[\lambda = sensitivity\\to\\screams\]

## decide testing rate (min,med,max or off)
testing('min')
## set up run
stanname='beta_mean1beta_PunSens.stan'
stanfile <- file.path(scriptdir, stanname)
flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus= t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled))
flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?
hash mismatch so recompiling; make sure Stan code ends with a blank line

SAMPLING FOR MODEL 'beta_mean1beta_PunSens' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.008693 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 86.93 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: Iteration:   1 / 400 [  0%]  (Warmup)
Chain 1: Iteration:  40 / 400 [ 10%]  (Warmup)
Chain 1: Iteration:  80 / 400 [ 20%]  (Warmup)
Chain 1: Iteration: 120 / 400 [ 30%]  (Warmup)
Chain 1: Iteration: 160 / 400 [ 40%]  (Warmup)
Chain 1: Iteration: 200 / 400 [ 50%]  (Warmup)
Chain 1: Iteration: 201 / 400 [ 50%]  (Sampling)
Chain 1: Iteration: 240 / 400 [ 60%]  (Sampling)
Chain 1: Iteration: 280 / 400 [ 70%]  (Sampling)
Chain 1: Iteration: 320 / 400 [ 80%]  (Sampling)
Chain 1: Iteration: 360 / 400 [ 90%]  (Sampling)
Chain 1: Iteration: 400 / 400 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 81.4254 seconds (Warm-up)
Chain 1:                37.8561 seconds (Sampling)
Chain 1:                119.281 seconds (Total)
Chain 1: 
save(flare_fit, file=file.path(datadir,'flare_fit_test'))
traceplot(flare_fit,'lp__')

# extract fit data
summary_flare <- summary(flare_fit)
# extract model summary data
#flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
## get some basic output descriptions printed to screen
out_describe(summary_flare)

Attaching package: ‘psych’

The following object is masked _by_ ‘.GlobalEnv’:

    logistic

The following objects are masked from ‘package:scales’:

    alpha, rescale

The following object is masked from ‘package:rstan’:

    lookup

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha

The following object is masked from ‘package:boot’:

    logit
[1] "400 iterations  on 1 chains. "
[1] "Estimated 99 Free paramaters per person"
[1] " "
[1] "Average Rhat"
[1] 1
[1] "alpha[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.11 0.03   0.11    0.11 0.02 0.04 0.24  0.21 1.14      3.3  0
[1] " "
[1] "beta[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 342 0.19 0.06    0.2     0.2 0.06 0.01 0.3  0.29 -0.56    -0.17  0
[1] " "
[1] "first[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5 0.01 0.46 0.53  0.06 -0.57     3.01  0
[1] " "
[1] "lambda[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis   se
X1    1 342 0.63 0.11   0.64    0.64 0.07 0.19 0.89   0.7 -1.31     3.03 0.01
[1] " "
[1] "loglik[1]"
[1] " "
   vars   n   mean   sd median trimmed  mad    min    max range skew kurtosis   se
X1    1 342 -47.45 5.17 -48.57  -48.03 5.36 -53.98 -27.16 26.82 0.89     0.24 0.28
[1] " "
[1] "shape1_Plus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range  skew kurtosis   se
X1    1 342 0.89 1.14   0.67    0.72 0.19 0.44 17.17 16.73 10.62   134.51 0.06
[1] " "
[1] "shape1_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342  0.9 0.99    0.7    0.74 0.2 0.45 14.36 13.91 9.77   116.72 0.05
[1] " "
[1] "shape1_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.89 0.86   0.71    0.76 0.2 0.46 11.9 11.44 8.79    97.02 0.05
[1] " "
[1] "shape1_Plus[4,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.75   0.68    0.71 0.2 0.43 9.96  9.53  8.2     85.4 0.04
[1] " "
[1] "shape1_Plus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.8 0.57   0.65     0.7 0.19 0.42 6.43  6.01 6.09    49.62 0.03
[1] " "
[1] "shape1_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.82 0.54   0.67    0.72 0.19 0.44 5.91  5.47 5.59     42.2 0.03
[1] " "
[1] "shape1_Plus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.72 0.43   0.59    0.64 0.17 0.39 4.22  3.82  4.5    27.34 0.02
[1] " "
[1] "shape1_Plus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.63 0.36   0.52    0.56 0.15 0.33 3.46  3.13 4.07    23.13 0.02
[1] " "
[1] "shape1_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342  0.7 0.37   0.58    0.62 0.17 0.39 3.6  3.21 3.96    21.64 0.02
[1] " "
[1] "shape1_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.74 0.39   0.62    0.67 0.18 0.41 3.7  3.29 3.91    20.93 0.02
[1] " "
[1] "shape1_Plus[11,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.77 0.4   0.65    0.69 0.19 0.42 3.78  3.35 3.91    20.81 0.02
[1] " "
[1] "shape1_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.78 0.41   0.66    0.71 0.19 0.43 3.83   3.4 3.93    20.96 0.02
[1] " "
[1] "shape1_Minus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range  skew kurtosis   se
X1    1 342 0.89 1.14   0.67    0.72 0.19 0.44 17.17 16.73 10.62   134.51 0.06
[1] " "
[1] "shape1_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342  0.9 0.99    0.7    0.74 0.2 0.45 14.36 13.91 9.77   116.72 0.05
[1] " "
[1] "shape1_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.89 0.86   0.71    0.76 0.2 0.46 11.9 11.44 8.79    97.02 0.05
[1] " "
[1] "shape1_Minus[4,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min  max range skew kurtosis   se
X1    1 342 0.84 0.75   0.68    0.71 0.2 0.43 9.96  9.53  8.2     85.4 0.04
[1] " "
[1] "shape1_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342  0.8 0.57   0.65     0.7 0.19 0.42 6.43  6.01 6.09    49.62 0.03
[1] " "
[1] "shape1_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.82 0.54   0.67    0.72 0.19 0.44 5.91  5.47 5.59     42.2 0.03
[1] " "
[1] "shape1_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.72 0.43   0.59    0.64 0.17 0.39 4.22  3.82  4.5    27.34 0.02
[1] " "
[1] "shape1_Minus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.63 0.36   0.52    0.56 0.15 0.33 3.46  3.13 4.07    23.13 0.02
[1] " "
[1] "shape1_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342  0.7 0.37   0.58    0.62 0.17 0.39 3.6  3.21 3.96    21.64 0.02
[1] " "
[1] "shape1_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.74 0.39   0.62    0.67 0.18 0.41 3.7  3.29 3.91    20.93 0.02
[1] " "
[1] "shape1_Minus[11,1]"
[1] " "
   vars   n mean  sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.77 0.4   0.65    0.69 0.19 0.42 3.78  3.35 3.91    20.81 0.02
[1] " "
[1] "shape1_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.78 0.41   0.66    0.71 0.19 0.43 3.83   3.4 3.93    20.96 0.02
[1] " "
[1] "shape2_Plus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 0.89 1.17   0.66    0.71 0.19 0.43 16.34 15.91 9.88   114.32 0.06
[1] " "
[1] "shape2_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min   max range  skew kurtosis   se
X1    1 342 0.87 1.29   0.62    0.68 0.18 0.4 18.64 18.24 10.42   126.37 0.07
[1] " "
[1] "shape2_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range  skew kurtosis   se
X1    1 342 0.85 1.35    0.6    0.65 0.19 0.36 19.63 19.27 10.61   130.43 0.07
[1] " "
[1] "shape2_Plus[4,1]"
[1] " "
   vars   n mean   sd median trimmed mad min   max range  skew kurtosis   se
X1    1 342 0.89 1.37   0.63    0.69 0.2 0.3 19.86 19.56 10.51   128.72 0.07
[1] " "
[1] "shape2_Plus[5,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range  skew kurtosis   se
X1    1 342 0.91 1.32   0.65    0.71 0.2 0.41 18.83 18.42 10.22   121.84 0.07
[1] " "
[1] "shape2_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range  skew kurtosis   se
X1    1 342 0.88 1.31   0.62    0.68 0.2 0.38 18.56 18.18 10.14   119.96 0.07
[1] " "
[1] "shape2_Plus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 0.94 1.19    0.7    0.75 0.21 0.46 16.24 15.79 9.52    107.1 0.06
[1] " "
[1] "shape2_Plus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 0.95 1.05   0.72    0.78 0.21 0.47 13.67  13.2 8.81    93.57 0.06
[1] " "
[1] "shape2_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 0.94 1.11   0.71    0.76 0.21 0.46 14.77 14.31 9.05    98.09 0.06
[1] " "
[1] "shape2_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342 0.91 1.14   0.67    0.73 0.2 0.43 15.38 14.95  9.2    101.3 0.06
[1] " "
[1] "shape2_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342 0.88 1.16   0.63    0.69 0.2 0.38 15.73 15.35 9.31    103.6 0.06
[1] " "
[1] "shape2_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342 0.85 1.17    0.6    0.66 0.2 0.31 15.94 15.62 9.39   105.31 0.06
[1] " "
[1] "shape2_Minus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 0.89 1.17   0.66    0.71 0.19 0.43 16.34 15.91 9.88   114.32 0.06
[1] " "
[1] "shape2_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min   max range  skew kurtosis   se
X1    1 342 0.87 1.29   0.62    0.68 0.18 0.4 18.64 18.24 10.42   126.37 0.07
[1] " "
[1] "shape2_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range  skew kurtosis   se
X1    1 342 0.85 1.35    0.6    0.65 0.19 0.36 19.63 19.27 10.61   130.43 0.07
[1] " "
[1] "shape2_Minus[4,1]"
[1] " "
   vars   n mean   sd median trimmed mad min   max range  skew kurtosis   se
X1    1 342 0.89 1.37   0.63    0.69 0.2 0.3 19.86 19.56 10.51   128.72 0.07
[1] " "
[1] "shape2_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range  skew kurtosis   se
X1    1 342 0.91 1.32   0.65    0.71 0.2 0.41 18.83 18.42 10.22   121.84 0.07
[1] " "
[1] "shape2_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range  skew kurtosis   se
X1    1 342 0.88 1.31   0.62    0.68 0.2 0.38 18.56 18.18 10.14   119.96 0.07
[1] " "
[1] "shape2_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 0.94 1.19    0.7    0.75 0.21 0.46 16.24 15.79 9.52    107.1 0.06
[1] " "
[1] "shape2_Minus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 0.95 1.05   0.72    0.78 0.21 0.47 13.67  13.2 8.81    93.57 0.06
[1] " "
[1] "shape2_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 342 0.94 1.11   0.71    0.76 0.21 0.46 14.77 14.31 9.05    98.09 0.06
[1] " "
[1] "shape2_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342 0.91 1.14   0.67    0.73 0.2 0.43 15.38 14.95  9.2    101.3 0.06
[1] " "
[1] "shape2_Minus[11,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342 0.88 1.16   0.63    0.69 0.2 0.38 15.73 15.35 9.31    103.6 0.06
[1] " "
[1] "shape2_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed mad  min   max range skew kurtosis   se
X1    1 342 0.85 1.17    0.6    0.66 0.2 0.31 15.94 15.62 9.39   105.31 0.06
[1] " "
[1] "VPlus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5 0.01 0.46 0.53  0.06 -0.57     3.01  0
[1] " "
[1] "VPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.52 0.02   0.52    0.52 0.01 0.42 0.59  0.16 -1.2     5.11  0
[1] " "
[1] "VPlus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.03   0.54    0.54 0.02 0.38 0.64  0.26 -1.32     5.76  0
[1] " "
[1] "VPlus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.51 0.05    0.5    0.51 0.05 0.31 0.68  0.37 -0.06     0.55  0
[1] " "
[1] "VPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.49 0.04    0.5     0.5 0.02 0.25 0.59  0.34 -2.48     11.4  0
[1] " "
[1] "VPlus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.51 0.04   0.52    0.52 0.03 0.24 0.64  0.39 -2.14     9.14  0
[1] " "
[1] "VPlus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.46 0.04   0.46    0.46 0.02 0.18 0.54  0.35 -2.85    13.31  0
[1] " "
[1] "VPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.41 0.04   0.41    0.41 0.02 0.14 0.49  0.35 -2.73    12.62  0
[1] " "
[1] "VPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.45 0.04   0.45    0.45 0.02 0.16 0.53  0.37 -2.85    12.68  0
[1] " "
[1] "VPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.47 0.05   0.48    0.48 0.03 0.17 0.59  0.42 -2.44     9.97  0
[1] " "
[1] "VPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.05    0.5     0.5 0.03 0.17 0.63  0.46 -2.08     8.01  0
[1] " "
[1] "VPlus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.51 0.06   0.52    0.52 0.04 0.18 0.67  0.49 -1.84     6.79  0
[1] " "
[1] "VMinus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.01    0.5     0.5 0.01 0.46 0.53  0.06 -0.57     3.01  0
[1] " "
[1] "VMinus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342 0.52 0.02   0.52    0.52 0.01 0.42 0.59  0.16 -1.2     5.11  0
[1] " "
[1] "VMinus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.54 0.03   0.54    0.54 0.02 0.38 0.64  0.26 -1.32     5.76  0
[1] " "
[1] "VMinus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.51 0.05    0.5    0.51 0.05 0.31 0.68  0.37 -0.06     0.55  0
[1] " "
[1] "VMinus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.49 0.04    0.5     0.5 0.02 0.25 0.59  0.34 -2.48     11.4  0
[1] " "
[1] "VMinus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.51 0.04   0.52    0.52 0.03 0.24 0.64  0.39 -2.14     9.14  0
[1] " "
[1] "VMinus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.46 0.04   0.46    0.46 0.02 0.18 0.54  0.35 -2.85    13.31  0
[1] " "
[1] "VMinus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.41 0.04   0.41    0.41 0.02 0.14 0.49  0.35 -2.73    12.62  0
[1] " "
[1] "VMinus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.45 0.04   0.45    0.45 0.02 0.16 0.53  0.37 -2.85    12.68  0
[1] " "
[1] "VMinus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.47 0.05   0.48    0.48 0.03 0.17 0.59  0.42 -2.44     9.97  0
[1] " "
[1] "VMinus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.05    0.5     0.5 0.03 0.17 0.63  0.46 -2.08     8.01  0
[1] " "
[1] "VMinus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342 0.51 0.06   0.52    0.52 0.04 0.18 0.67  0.49 -1.84     6.79  0
[1] " "
[1] "deltaPlus[1,1]"
[1] " "
   vars   n mean  sd median trimmed  mad   min  max range  skew kurtosis   se
X1    1 342 0.13 0.1   0.14    0.14 0.07 -0.32 0.36  0.68 -1.32     3.06 0.01
[1] " "
[1] "deltaPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min max range  skew kurtosis se
X1    1 342 0.11 0.09   0.12    0.12 0.07 -0.25 0.3  0.54 -1.28     2.64  0
[1] " "
[1] "deltaPlus[3,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min  max range skew kurtosis   se
X1    1 342 -0.24 0.32  -0.48   -0.24 0.16 -0.63 0.24  0.87 0.13    -1.89 0.02
[1] " "
[1] "deltaPlus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min  max range  skew kurtosis   se
X1    1 342 -0.18 0.36      0   -0.18 0.43 -0.68 0.35  1.03 -0.01    -1.91 0.02
[1] " "
[1] "deltaPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min  max range  skew kurtosis se
X1    1 342 0.14 0.07   0.15    0.15 0.06 -0.13 0.33  0.46 -0.97     1.75  0
[1] " "
[1] "deltaPlus[6,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.51 0.04  -0.52   -0.52 0.03 -0.64 -0.24  0.39 2.14     9.14  0
[1] " "
[1] "deltaPlus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.46 0.04  -0.46   -0.46 0.02 -0.54 -0.18  0.35 2.85    13.31  0
[1] " "
[1] "deltaPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min  max range  skew kurtosis se
X1    1 342 0.23 0.08   0.23    0.23 0.06 -0.09 0.49  0.58 -0.62     1.47  0
[1] " "
[1] "deltaPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min  max range  skew kurtosis se
X1    1 342 0.19 0.07    0.2    0.19 0.05 -0.09 0.36  0.45 -0.79     1.48  0
[1] " "
[1] "deltaPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min max range  skew kurtosis se
X1    1 342 0.16 0.06   0.17    0.16 0.05 -0.09 0.3  0.39 -0.87     1.56  0
[1] " "
[1] "deltaPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min  max range  skew kurtosis se
X1    1 342 0.14 0.05   0.14    0.14 0.04 -0.08 0.25  0.34 -0.92     1.62  0
[1] " "
[1] "deltaMinus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.5 0.01   -0.5    -0.5 0.01 -0.53 -0.46  0.06 0.57     3.01  0
[1] " "
[1] "deltaMinus[2,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.52 0.02  -0.52   -0.52 0.01 -0.59 -0.42  0.16  1.2     5.11  0
[1] " "
[1] "deltaMinus[3,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.54 0.03  -0.54   -0.54 0.02 -0.64 -0.38  0.26 1.32     5.76  0
[1] " "
[1] "deltaMinus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.51 0.05   -0.5   -0.51 0.05 -0.68 -0.31  0.37 0.06     0.55  0
[1] " "
[1] "deltaMinus[5,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.49 0.04   -0.5    -0.5 0.02 -0.59 -0.25  0.34 2.48     11.4  0
[1] " "
[1] "deltaMinus[6,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.51 0.04  -0.52   -0.52 0.03 -0.64 -0.24  0.39 2.14     9.14  0
[1] " "
[1] "deltaMinus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.46 0.04  -0.46   -0.46 0.02 -0.54 -0.18  0.35 2.85    13.31  0
[1] " "
[1] "deltaMinus[8,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.41 0.04  -0.41   -0.41 0.02 -0.49 -0.14  0.35 2.73    12.62  0
[1] " "
[1] "deltaMinus[9,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.45 0.04  -0.45   -0.45 0.02 -0.53 -0.16  0.37 2.85    12.68  0
[1] " "
[1] "deltaMinus[10,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.47 0.05  -0.48   -0.48 0.03 -0.59 -0.17  0.42 2.44     9.97  0
[1] " "
[1] "deltaMinus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min   max range skew kurtosis se
X1    1 342 -0.5 0.05   -0.5    -0.5 0.03 -0.63 -0.17  0.46 2.08     8.01  0
[1] " "

Create BIC from log likelihood

## extract log likelihood
flare_loglike <- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
#calculate BIC
FLARe_bic<-bic(ntrials,-colMeans(flare_loglike),2) #number of parameters in that model e.g. 4)
## mean BIC as model comparisons tool:
print("Mean Bayesian information criterion for model")
[1] "Mean Bayesian information criterion for model"
mean(FLARe_bic)
[1] 99.87161

Add to bar plot

mod_comp
  X.Mean.no.beta. X.99.8716106029901.
1    Mean no beta    99.8716106029901

Generate

Recover

Rating consistency

A parameter that represents the rating consistency for multiple repeated / similar trials. I think it would be best to have one each for the CS+ and CS- given these differ in terms of how similar the trials are (CS- is always un-enforced for example). Can imagine consistency is a paramter that is concistent regardless of reinforcement / stimulus type though, especially in later phases. So worth testing both models.

A similar parameter is used in the charpentier et al. paper (see the last page before the references).

We will estimate this parameter as a factor that influences the overall shape of the choice probability distribution (beta distributiuon). It will do this via the sufficient parameters that are influences by stimulus value etc per trial.

note very unsure about this - need to check it out with Alex

\[shape1(stimulus) = (1 + exp(-\mu * VPlus[t,p] * ((VPlus[t,p] * (1-VPlus[t,p])) / beta[p,1]))^-1 \] where \[\mu = logit\\sensitivty\]

Where logit sensitivity effectively means consistency of rating consistency; higher valued should mean greater consistency.

## decide testing rate (min,med,max or off)
testing('min')
## set up run
stanname='beta_mean1beta_Consistency.stan'
stanfile <- file.path(scriptdir, stanname)
flare_data<-list(ntrials=ntrials,nsub=nsub,screamPlus = t(screamPlus), screamMinus= t(screamMinus),ratingsPlus=t(plus_scaled),ratingsMinus=t(minus_scaled))
flare_fit <- stan(file = stanfile, data = flare_data, iter=chain_iter, chains = chain_n) #add working dir?
hash mismatch so recompiling; make sure Stan code ends with a blank line

SAMPLING FOR MODEL 'beta_mean1beta_Consistency' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.010332 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 103.32 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: Iteration:   1 / 400 [  0%]  (Warmup)
Chain 1: Iteration:  40 / 400 [ 10%]  (Warmup)
Chain 1: Iteration:  80 / 400 [ 20%]  (Warmup)
Chain 1: Iteration: 120 / 400 [ 30%]  (Warmup)
Chain 1: Iteration: 160 / 400 [ 40%]  (Warmup)
Chain 1: Iteration: 200 / 400 [ 50%]  (Warmup)
Chain 1: Iteration: 201 / 400 [ 50%]  (Sampling)
Chain 1: Iteration: 240 / 400 [ 60%]  (Sampling)
Chain 1: Iteration: 280 / 400 [ 70%]  (Sampling)
Chain 1: Iteration: 320 / 400 [ 80%]  (Sampling)
Chain 1: Iteration: 360 / 400 [ 90%]  (Sampling)
Chain 1: Iteration: 400 / 400 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 32.2791 seconds (Warm-up)
Chain 1:                25.1453 seconds (Sampling)
Chain 1:                57.4244 seconds (Total)
Chain 1: 
There were 200 divergent transitions after warmup. Increasing adapt_delta above 0.8 may help. See
http://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmupThere were 1 chains where the estimated Bayesian Fraction of Missing Information was low. See
http://mc-stan.org/misc/warnings.html#bfmi-lowExamine the pairs() plot to diagnose sampling problems
save(flare_fit, file=file.path(datadir,'flare_fit_test'))
traceplot(flare_fit,'lp__')

# extract fit data
summary_flare_con <- summary(flare_fit)
# extract model summary data
#flare_loglike<- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
## get some basic output descriptions printed to screen
out_describe(summary_flare_con)
[1] "400 iterations  on 1 chains. "
[1] "Estimated 99 Free paramaters per person"
[1] " "
[1] "Average Rhat"
[1] 0.651998
[1] "alpha[1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.37 0.26   0.31    0.35 0.25   0 0.98  0.98 0.65    -0.55 0.01
[1] " "
[1] "beta[1]"
[1] " "
   vars   n          mean  sd        median       trimmed           mad min           max         range
X1    1 342 1.307338e+306 Inf 1.732597e+260 1.028772e+288 2.568748e+260   0 9.149915e+307 9.149915e+307
   skew kurtosis  se
X1  NaN      NaN Inf
[1] " "
[1] "first[1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342  0.5 0.03    0.5     0.5 0.04 0.44 0.56  0.11 0.02    -1.17  0
[1] " "
[1] "mu[1]"
[1] " "
   vars   n mean   sd median trimmed  mad min max range  skew kurtosis   se
X1    1 342 0.54 0.26   0.53    0.55 0.29   0   1  0.99 -0.07     -0.9 0.01
[1] " "
[1] "loglik[1]"
[1] " "
   vars   n  mean   sd median trimmed mad    min    max range  skew kurtosis   se
X1    1 342 -60.6 8.03 -58.54  -59.84 8.3 -79.42 -46.09 33.33 -0.59    -0.85 0.43
[1] " "
[1] "shape1_Plus[1,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.25 0.02
[1] " "
[1] "shape1_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Plus[4,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.24 0.02
[1] " "
[1] "shape1_Plus[5,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Plus[7,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Plus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.71 0.45      2    1.76   0   1   2     1 -0.88    -1.21 0.02
[1] " "
[1] "shape1_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Plus[12,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.23 0.02
[1] " "
[1] "shape1_Minus[1,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.25 0.02
[1] " "
[1] "shape1_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Minus[4,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.24 0.02
[1] " "
[1] "shape1_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Minus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.71 0.45      2    1.76   0   1   2     1 -0.88    -1.21 0.02
[1] " "
[1] "shape1_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Minus[11,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape1_Minus[12,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.23 0.02
[1] " "
[1] "shape2_Plus[1,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.25 0.02
[1] " "
[1] "shape2_Plus[2,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.71 0.45      2    1.76   0   1   2     1 -0.88    -1.22 0.02
[1] " "
[1] "shape2_Plus[3,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.72 0.43      2    1.77   0   1   2     1 -0.92    -1.12 0.02
[1] " "
[1] "shape2_Plus[4,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.72 0.43      2    1.78   0   1   2     1 -0.94    -1.08 0.02
[1] " "
[1] "shape2_Plus[5,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.71 0.45      2    1.76   0   1   2     1 -0.87    -1.23 0.02
[1] " "
[1] "shape2_Plus[6,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range skew kurtosis   se
X1    1 342 1.72 0.44      2    1.77   0   1   2     1 -0.9    -1.17 0.02
[1] " "
[1] "shape2_Plus[7,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.25 0.02
[1] " "
[1] "shape2_Plus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape2_Plus[9,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.24 0.02
[1] " "
[1] "shape2_Plus[10,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.71 0.44      2    1.76   0   1   2     1 -0.89     -1.2 0.02
[1] " "
[1] "shape2_Plus[11,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.73 0.42      2    1.78   0   1   2     1 -0.94    -1.06 0.02
[1] " "
[1] "shape2_Plus[12,1]"
[1] " "
   vars   n mean  sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.75 0.4      2    1.81   0   1   2     1 -1.04    -0.81 0.02
[1] " "
[1] "shape2_Minus[1,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.25 0.02
[1] " "
[1] "shape2_Minus[2,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.71 0.45      2    1.76   0   1   2     1 -0.88    -1.22 0.02
[1] " "
[1] "shape2_Minus[3,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.72 0.43      2    1.77   0   1   2     1 -0.92    -1.12 0.02
[1] " "
[1] "shape2_Minus[4,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.72 0.43      2    1.78   0   1   2     1 -0.94    -1.08 0.02
[1] " "
[1] "shape2_Minus[5,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.71 0.45      2    1.76   0   1   2     1 -0.87    -1.23 0.02
[1] " "
[1] "shape2_Minus[6,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range skew kurtosis   se
X1    1 342 1.72 0.44      2    1.77   0   1   2     1 -0.9    -1.17 0.02
[1] " "
[1] "shape2_Minus[7,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.25 0.02
[1] " "
[1] "shape2_Minus[8,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.86    -1.25 0.02
[1] " "
[1] "shape2_Minus[9,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342  1.7 0.45      2    1.75   0   1   2     1 -0.87    -1.24 0.02
[1] " "
[1] "shape2_Minus[10,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.71 0.44      2    1.76   0   1   2     1 -0.89     -1.2 0.02
[1] " "
[1] "shape2_Minus[11,1]"
[1] " "
   vars   n mean   sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.73 0.42      2    1.78   0   1   2     1 -0.94    -1.06 0.02
[1] " "
[1] "shape2_Minus[12,1]"
[1] " "
   vars   n mean  sd median trimmed mad min max range  skew kurtosis   se
X1    1 342 1.75 0.4      2    1.81   0   1   2     1 -1.04    -0.81 0.02
[1] " "
[1] "VPlus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342  0.5 0.03    0.5     0.5 0.04 0.44 0.56  0.11 0.02    -1.17  0
[1] " "
[1] "VPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.68 0.13   0.66    0.67 0.13 0.45 0.99  0.54 0.59    -0.54 0.01
[1] " "
[1] "VPlus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis   se
X1    1 342 0.76 0.15   0.76    0.77 0.18 0.46   1  0.54 -0.04    -1.05 0.01
[1] " "
[1] "VPlus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis   se
X1    1 342 0.63 0.23   0.55    0.64 0.21 0.02   1  0.98 -0.08    -0.44 0.01
[1] " "
[1] "VPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis   se
X1    1 342 0.57 0.17   0.59    0.59 0.12 0.02 0.98  0.97 -0.93     1.58 0.01
[1] " "
[1] "VPlus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.74 0.12   0.73    0.74 0.12 0.46   1  0.54 0.17    -0.44 0.01
[1] " "
[1] "VPlus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis   se
X1    1 342 0.44 0.15    0.5    0.46 0.08 0.02 0.58  0.57 -1.28     0.52 0.01
[1] " "
[1] "VPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range  skew kurtosis   se
X1    1 342 0.31 0.17   0.35    0.32 0.19   0 0.55  0.55 -0.48    -1.04 0.01
[1] " "
[1] "VPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.61 0.11   0.57    0.59 0.03 0.46 0.98  0.53 1.73     2.09 0.01
[1] " "
[1] "VPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.73 0.13    0.7    0.72 0.12 0.46   1  0.54  0.5    -0.72 0.01
[1] " "
[1] "VPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis   se
X1    1 342 0.79 0.14   0.78    0.79 0.17 0.47   1  0.53 -0.14    -0.97 0.01
[1] " "
[1] "VPlus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis   se
X1    1 342 0.83 0.14   0.85    0.84 0.16 0.47   1  0.53 -0.56    -0.68 0.01
[1] " "
[1] "VMinus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 342  0.5 0.03    0.5     0.5 0.04 0.44 0.56  0.11 0.02    -1.17  0
[1] " "
[1] "VMinus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.68 0.13   0.66    0.67 0.13 0.45 0.99  0.54 0.59    -0.54 0.01
[1] " "
[1] "VMinus[3,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis   se
X1    1 342 0.76 0.15   0.76    0.77 0.18 0.46   1  0.54 -0.04    -1.05 0.01
[1] " "
[1] "VMinus[4,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis   se
X1    1 342 0.63 0.23   0.55    0.64 0.21 0.02   1  0.98 -0.08    -0.44 0.01
[1] " "
[1] "VMinus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis   se
X1    1 342 0.57 0.17   0.59    0.59 0.12 0.02 0.98  0.97 -0.93     1.58 0.01
[1] " "
[1] "VMinus[6,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.74 0.12   0.73    0.74 0.12 0.46   1  0.54 0.17    -0.44 0.01
[1] " "
[1] "VMinus[7,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis   se
X1    1 342 0.44 0.15    0.5    0.46 0.08 0.02 0.58  0.57 -1.28     0.52 0.01
[1] " "
[1] "VMinus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range  skew kurtosis   se
X1    1 342 0.31 0.17   0.35    0.32 0.19   0 0.55  0.55 -0.48    -1.04 0.01
[1] " "
[1] "VMinus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.61 0.11   0.57    0.59 0.03 0.46 0.98  0.53 1.73     2.09 0.01
[1] " "
[1] "VMinus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.73 0.13    0.7    0.72 0.12 0.46   1  0.54  0.5    -0.72 0.01
[1] " "
[1] "VMinus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis   se
X1    1 342 0.79 0.14   0.78    0.79 0.17 0.47   1  0.53 -0.14    -0.97 0.01
[1] " "
[1] "VMinus[12,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range  skew kurtosis   se
X1    1 342 0.83 0.14   0.85    0.84 0.16 0.47   1  0.53 -0.56    -0.68 0.01
[1] " "
[1] "deltaPlus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis se
X1    1 342  0.5 0.03    0.5     0.5 0.04 0.44 0.56  0.11 -0.02    -1.17  0
[1] " "
[1] "deltaPlus[2,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis   se
X1    1 342 0.32 0.13   0.34    0.33 0.13 0.01 0.55  0.54 -0.59    -0.54 0.01
[1] " "
[1] "deltaPlus[3,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 -0.28 0.51  -0.52   -0.28 0.71  -1 0.53  1.53 0.06     -1.7 0.03
[1] " "
[1] "deltaPlus[4,1]"
[1] " "
   vars   n  mean  sd median trimmed mad min  max range  skew kurtosis   se
X1    1 342 -0.12 0.7   0.44   -0.12 0.7  -1 0.98  1.98 -0.06    -1.84 0.04
[1] " "
[1] "deltaPlus[5,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range skew kurtosis   se
X1    1 342 0.43 0.17   0.41    0.41 0.12 0.02 0.98  0.97 0.93     1.58 0.01
[1] " "
[1] "deltaPlus[6,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad min   max range  skew kurtosis   se
X1    1 342 -0.74 0.12  -0.73   -0.74 0.12  -1 -0.46  0.54 -0.17    -0.44 0.01
[1] " "
[1] "deltaPlus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis   se
X1    1 342 -0.44 0.15   -0.5   -0.46 0.08 -0.58 -0.02  0.57 1.28     0.52 0.01
[1] " "
[1] "deltaPlus[8,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min max range skew kurtosis   se
X1    1 342 0.69 0.17   0.65    0.68 0.19 0.45   1  0.55 0.48    -1.04 0.01
[1] " "
[1] "deltaPlus[9,1]"
[1] " "
   vars   n mean   sd median trimmed  mad  min  max range  skew kurtosis   se
X1    1 342 0.39 0.11   0.43    0.41 0.03 0.02 0.54  0.53 -1.73     2.09 0.01
[1] " "
[1] "deltaPlus[10,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.27 0.13    0.3    0.28 0.12   0 0.54  0.54 -0.5    -0.72 0.01
[1] " "
[1] "deltaPlus[11,1]"
[1] " "
   vars   n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 342 0.21 0.14   0.22    0.21 0.17   0 0.53  0.53 0.14    -0.97 0.01
[1] " "
[1] "deltaMinus[1,1]"
[1] " "
   vars   n mean   sd median trimmed  mad   min   max range  skew kurtosis se
X1    1 342 -0.5 0.03   -0.5    -0.5 0.04 -0.56 -0.44  0.11 -0.02    -1.17  0
[1] " "
[1] "deltaMinus[2,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis   se
X1    1 342 -0.68 0.13  -0.66   -0.67 0.13 -0.99 -0.45  0.54 -0.59    -0.54 0.01
[1] " "
[1] "deltaMinus[3,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad min   max range skew kurtosis   se
X1    1 342 -0.76 0.15  -0.76   -0.77 0.18  -1 -0.46  0.54 0.04    -1.05 0.01
[1] " "
[1] "deltaMinus[4,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad min   max range skew kurtosis   se
X1    1 342 -0.63 0.23  -0.55   -0.64 0.21  -1 -0.02  0.98 0.08    -0.44 0.01
[1] " "
[1] "deltaMinus[5,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis   se
X1    1 342 -0.57 0.17  -0.59   -0.59 0.12 -0.98 -0.02  0.97 0.93     1.58 0.01
[1] " "
[1] "deltaMinus[6,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad min   max range  skew kurtosis   se
X1    1 342 -0.74 0.12  -0.73   -0.74 0.12  -1 -0.46  0.54 -0.17    -0.44 0.01
[1] " "
[1] "deltaMinus[7,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range skew kurtosis   se
X1    1 342 -0.44 0.15   -0.5   -0.46 0.08 -0.58 -0.02  0.57 1.28     0.52 0.01
[1] " "
[1] "deltaMinus[8,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min max range skew kurtosis   se
X1    1 342 -0.31 0.17  -0.35   -0.32 0.19 -0.55   0  0.55 0.48    -1.04 0.01
[1] " "
[1] "deltaMinus[9,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad   min   max range  skew kurtosis   se
X1    1 342 -0.61 0.11  -0.57   -0.59 0.03 -0.98 -0.46  0.53 -1.73     2.09 0.01
[1] " "
[1] "deltaMinus[10,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad min   max range skew kurtosis   se
X1    1 342 -0.73 0.13   -0.7   -0.72 0.12  -1 -0.46  0.54 -0.5    -0.72 0.01
[1] " "
[1] "deltaMinus[11,1]"
[1] " "
   vars   n  mean   sd median trimmed  mad min   max range skew kurtosis   se
X1    1 342 -0.79 0.14  -0.78   -0.79 0.17  -1 -0.47  0.53 0.14    -0.97 0.01
[1] " "

The alpha parameter variance is normal (mean 0.4 and sd 0.12). Beta is much more bounded now though (combined across both stimuli mean 0.79, sd=1.6) over 4000 iterations on 4 chains.

Create BIC from log likelihood

## extract log likelihood
flare_loglike_con <- extract_log_lik(flare_fit, parameter_name = "loglik", merge_chains = TRUE)
#calculate BIC
FLARe_bic<-bic(ntrials,-colMeans(flare_loglike_con),2) #number of parameters in that model e.g. 4)
## mean BIC as model comparisons tool:
print("Mean Bayesian information criterion for model")
[1] "Mean Bayesian information criterion for model"
mean(FLARe_bic)
[1] 126.1612

Add to bar plot

mod_comp <- rbind(na.omit(mod_comp),c("...Consistency",mean(FLARe_bic)))
invalid factor level, NA generatedinvalid factor level, NA generated
plot <- ggplot(mod_comp,aes(x=model,y=BIC)) +
  geom_bar(stat = "identity") +
  coord_flip()
show(plot)
Error: Aesthetics must be either length 1 or the same as the data (2): x

Generalisation

this is similar to Tobys ‘leaky betas’ I think…

Basically here we want to capture a parameter that estimates how much the learning from the reinforced stimulus influences responses to the ‘safe’ stimulus.

Forgetting

this paramter is hopw much they retasin what they learned over previous trials and use it to inform the current rating.

to do

investigte change point detection paramters (when reinforcement changes - i.e. moving acquisition to extinction) could do this or model the phases separately - check which best fits

add priors! These are what you expect the group to look like (i.e alpha is normally distributed around a mean of 0.5 with variance of 10 or something) LOOKUP R stan choice of priors. * can have informative or uninformative priors (i.e. agnostic or not)

Push any updates to github

Any push the updates to github

Unhash the series below if you made any changes.

LS0tCnRpdGxlOiAiSGllcmFjaGFsIGNvbXB1dGF0aW9uYWwgbW9kZWxsaW5nIC0gRkxBUmUiCgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lCiAgICB0aGVtZTogY2VydWxlYW4KICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgIAogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogY2VydWxlYW4KICAgIHRvYzogeWVzCiAgIAotLS0KCiMgSW50cm9kdWN0aW9uIHsudGFic2V0fQoKTGFiIGJvb2sgZm9yIGFuYWx5c2VzIHVzaW5nIGhpZXJhY2hhbCBjb21wdXRhdGlvbmFsIG1vZGVsbGluZyB0byBpZGVudGlmeSBwYXJhbXRlcnMgdGhhdCBkZWZpbmUgdGhlIGJlc3QgbW9kZWwgb2YgbGVhcm5pbmcgYXMgaXQgYXBwbGllcyB0byBmZWFyIGNvbmRpdGlvbmluZyBhY3F1aXNpdGlvbiBhbmQgZXh0aW5jdGlvbiB1c2luZyBGTEFSZSBmZWFyIGNvbmRpdGlvbmluZyBkYXRhLiAKTG9uZyBhYnN0cmFjdCwganVzdGlmaWNhdGlvbiBhbmQgYW5hbHlzaXMgcGxhbiBmb3VuZCBpbiBwcmVsaW0gbWFudXNjcmlwdCBbaGVyZV0oW2h0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMUpoVkNmMGpsWEZ3WFlRMmtqUzNmcGw3bVlleERjVUxuN0wxWmdKNk5vbHcvZWRpdD91c3A9c2hhcmluZ10pCgpJbiBzaG9ydDoKCiMjIEFpbXMgICAgCiAgICAgCjEuICBJZGVudGlmeSBtb2RlbCBvZiBsZWFybmluZyBiYXNlZCBvbiBhIHByaW9yaSBoeXBvdGhlc2VzIHRoYXQgYmVzdCBmaXRzIHRoZSB0cmFqZWN0b3JpZXMgb2YgZmVhciByZWxldmFudCBsZWFybmluZyBpbiBvdXIgRkxBUmUgZGF0YXNldAogICAgICArIFVzZSBhbGwgZmlyc3Qgd2VlayBkYXRhIGZyb20gVmFsaWRhdGlvbiwgYXBwIFRSVCwgbGFiIFRSVCwgUGlsb3QsIEhlYWRwaG9uZXMgKG4gPSAyMjMgYWZ0ZXIgZXhjbHVzaW9ucykKICAgICAgKyBJbmNsdWRlIEFjcXVpc2l0aW9uLCBleHRpbmN0aW9uICh0cmFqZWN0b3JpZXMgcmVwcmVzZW50aW5nIGZlYXIgbGVhcm5pbmcgYW5kIHRyZWF0bWVudCkKICAgICAgKyBJZGVudGlmeSBwYXJhbWV0ZXJzIHRoYXQgZGVmaW5lIHRoZXNlIHRyYWplY3RvcmllcwogICAgICAgICAgKyBlLmcuIExlYXJuaWduIHJhdGUsIHBsYXRlYXUsIGZpcnN0IGFtYmlndW91cyB0cmlhbCBldGMuCiAgICAgICAgICAKMi4gIENyb3NzIHZhbGlkYXRlIGJlc3QgZml0dGluZyBtb2RlbCBpbiBURURTIGRhdGEKCjMuICBBcmUgdGhlc2UgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggb3RoZXIgZW1hc3VyZXMgb2YgaW5kc2l2aWR1YWwgZGlmZmVyZW5jZXMgaW4gb3VyIGRhdGFzZXRzPwogICAgICArIFBlcnNvbmFsaXR5IChOZXVyb3RpY2lzbSkKICAgICAgKyBDdXJyZW50IGFueGlldHkgc3ltcHRvbXMgKEdBRC03KSAtIGVxdWl2YWxlbnQgb2YgYmFzZWxpbmUgc3ltcHRvbXMgKENocmlzICsgTWVnIGFuYWx5c2VzKQogICAgICArIExpZmV0aW1lIC8gdHJhaXQgYW54aWV0eSAoU1RBSSAvIEFTSSAtIEZMQVJlIGFuYWx5c2VzKQogICAgICArIEN1cnJlbnQgZGVwcmVzc2lvbiBzeW1wdG9tcyAoUEhRLTkpIC0gIGVxdWl2YWxlbnQgb2YgYmFzZWxpbmUgc3ltcHRvbXMgKENocmlzICsgTWVnIGFuYWx5c2VzKQogICAgICArIEludGVycHJldGF0aW9uIGJpYXNlcyAoSVVTLCBBU1NJUSAtIEZMQVJlIGFuYWx5c2VzKQogICAgICArIFNFUyAoTWVnIElBUFQ6IGJlbmVmaXRzLCBlbXBsb3ltZW50IGV0YykgCiAgICAgICsgR2VuZGVyIChNZWcgYW5hbHlzZXMpCiAgICAgICsgRW1vdGlvbiByZWd1bGF0aW9uIHByb2ZpbGUgKHBvdGVudGlhbGx5IExDQSBiYXNlZD8pCgoKIyMgSW1wYWN0IGFuZCByZWxldmFuY2UKCmBgYApFdmlkZW5jZSBmcm9tIGJvdGggaHVtYW4gKFJpY2h0ZXIgZXQgYWwuLCAyMDEyKSBhbmQgcm9kZW50IChHYWxhdHplci1MZXZ5LCBCb25hbm5vLCBCdXNoLCAmIExlRG91eCwgMjAxMykgc3R1ZGllcyBzdWdnZXN0IHRoYXQgdHJhamVjdG9yaWVzIG9mIGhvdyB3ZSBsZWFybiBhbmQgZXh0aW5ndWlzaCBmZWFyIGRpZmZlciBiZXR3ZWVuIGluZGl2aWR1YWxzLiBEaWZmZXJlbnQgdHJhamVjdG9yaWVzIG9mIGZlYXIgYW5kIGV4dGluY3Rpb24gaGF2ZSBhbHNvIGJlZW4gZm91bmQgdXNpbmcgZmVhciBjb25kaXRpb25pbmcgc3R1ZGllcyAoZS5nLiBEdWl0cyBldCBhbC4sIDIwMTYpLCBhIGdvb2QgbW9kZWwgZm9yIHRoZSBsZWFybmluZyBvZiwgYW5kIHRyZWF0bWVudCBmb3IsIGZlYXIgYW5kIGFueGlldHkgZGlzb3JkZXJzLiBJdCBpcyBsaWtlbHkgdGhhdCB0aGVzZSB0cmFqZWN0b3JpZXMgb2YgZmVhciBleHRpbmN0aW9uIG1pZ2h0IHByZWRpY3Qgb3V0Y29tZXMgaW4gZXhwb3N1cmUtYmFzZWQgY29nbml0aXZlIGJlaGF2aW91cmFsIHRoZXJhcHkgKEtpbmR0LCAyMDE0KS4gCiAKSWRlbnRpZnlpbmcgcGFyYW1ldGVycyB0aGF0IHByZWRpY3QgaW5kaXZpZHVhbCB0cmFqZWN0b3JpZXMgb2YgZmVhciBsZWFybmluZyBhbmQgZXh0aW5jdGlvbiB3aWxsIGVuYWJsZSB1cyB0byBoYXJuZXNzIGZlYXIgY29uZGl0aW9uaW5nIGRhdGEgbW9yZSBlZmZlY3RpdmVseSB0byBhaWQgaW4gdW5kZXJzdGFuZGluZyBtZWNoYW5pc21zIHVuZGVybHlpbmcgdGhlIGRldmVsb3BtZW50IG9mIGFuZCB0cmVhdG1lbnQgZm9yIGFueGlldHkgZGlzb3JkZXJzLiBXaXRoIG1vcmUgYWNjdXJhdGUgbW9kZWxzIG9mIHRoZXNlIHByb2Nlc3NlcywgdGhlIHBvdGVudGlhbCB0byB1c2UgZmVhciBjb25kaXRpb25pbmcgcGFyYWRpZ21zIHRvIHByZWRpY3QgdGhvc2UgbW9zdCBhdCByaXNrIG9mIGRldmVsb3BpbmcgYW4gYW54aWV0eSBkaXNvcmRlciwgYW5kIHRob3NlIHdobyBtaWdodCByZXNwb25kIGJlc3QgdG8gZXhwb3N1cmUtYmFzZWQgdHJlYXRtZW50cywgZ3JlYXRseSBpbXByb3Zlcy4KYGBgCgojIyBVc2VmdWwgcmVmZXJlbmNlcwoKW1N1dHRvbiBhbmQgQmFydG8gUmVpbmZvcmNlbWVudCBMZWFybmluZ10oaHR0cDovL2luY29tcGxldGVpZGVhcy5uZXQvYm9vay9STGJvb2syMDE4LnBkZikgLSBUZXh0Ym9vayBvbiByZWluZm9yY2VtZW50IGxlYXJuaW5nICAgCltBbnhpZXR5IHByb21vdGVzIG1lbW9yeSBmb3IgbW9vZC1jb25ncnVlbnQgZmFjZXMgYnV0IGRvZXMgbm90IGFsdGVyIGxvc3MgYXZlcnNpb24gKENoYXJwZW50aWVyLi4uUm9iaW5zb24sIDIwMTUpXShodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzL3NyZXAyNDc0Ni5wZGYpIC0gR29vZCBleGFtcGxlIG9mIGEgc2Vuc2l0aXZpdHkgbGVhcm5pbmcgcGFyYW1ldGVyICAgIApbSHlwb3RoZXNlcyBBYm91dCB0aGUgUmVsYXRpb25zaGlwIG9mIENvZ25pdGlvbiBXaXRoIFBzeWNob3BhdGhvbG9neSBTaG91bGQgYmUgVGVzdGVkIGJ5IEVtYmVkZGluZyBUaGVtIEludG8gRW1waXJpY2FsIFByaW9ycyAoTW91dG91c3Npc3QgZXQgYWwuLCAyMDE4KV0oaHR0cHM6Ly93d3cuZnJvbnRpZXJzaW4ub3JnL2FydGljbGVzLzEwLjMzODkvZnBzeWcuMjAxOC4wMjUwNC9mdWxsKSAtIEluY2x1ZGluZyB2YXJpYWJsZXMgb2YgaW50ZXJlc3QgKGUuZy4gYW54aWV0eSkgaW4gdGhlIG1vZGVsICAgIAoKClRvYnkgV2lzZSBoYXMganVzdCBzdWJtaXR0ZWQgYW4gYXZlcnNpdmUgbGVhcm5pbmcgcGFwZXIgaW5jb3Jwb3JhdGluZyBiZXRhIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnMgaW4gdGhlIGJlc3QgbW9kZWwgZm9yIHVuY2VydGFpbiBsZWFybmluZyBwYXJhbXRlcnMgZXRjLgoKQSBjb3B5IG9mIHRoaXMgaXMgIVtoZXJlXSgvVXNlcnMva2lyc3Rpbi9Ecm9wYm94L1NHRFAvRkxBUmUvUERGcy91bmNlcnRhaW50eV9hdHRlbnRpb25fcGFwZXJfUExvU0NCLnBkZikKCgojIyBBbmFseXNpcyBwbGFuIAoKMS4gIERlZmluZSBzZXQgb2YgYSBwcmlvcmkgbW9kZWxzIG1vdmluZyBmcm9tIHNpbXBsZSB0byBtb3JlIGNvbXBsZXggIAogICAgICArIFNvbWUgcGFyYW10ZXJzIHRvIGluY2x1ZGU6IAogICAgICAgICsgUmF0ZSBvZiBsZWFybmluZyAoc29tZXRpbWVzIHdpdGggcHVuaXNobWVudCByZWluZm9yY2VtZW50KQogICAgICAgICsgU2Vuc2l0aXZpdHkgdG8gcHVuaXNobWVudAogICAgICAgICsgUHJlLWV4aXN0aW5nIGFueGlldHkKICAgICAgICArIFNFUz8gR2VuZGVyPyAgICAKICAgICAgICAKCiAgICAgICAgCjIuICBSdW4gZWFjaCBtb2RlbCBhbmQgY29tcGFyZSBmaXQgaW4gRkxBUmUgcHJlIFRFRFMgZGF0YQogICAgICArIFVzZSBMb2cgbGlrZWxpaG9vZCBhbmQgQklDIGV0Yy4gICAgCiAgICAgIAogICAgICAKMy4gIFNlbGVjdCBiZXN0IGZpdHRpbmcgbW9kZWwgICAKCgo0LiAgRXh0cmFjdCBpbmRpdmlkdWFsIGRhdGEgZm9yIGxlYXJuaW5nIHBhcmFtZXRlcnMgZnJvbSB0aGlzIG1vZGVsIGFuZCBzZWUgd2hhdCBmYWN0b3JzIGJlc3QgcHJlZGljdCBpdAogICAgICArIEFueGlldHkgKGlmIGFueGlldHkgaXNudCBiZXN0IGFzIHBhcnQgb2YgdGhlIG1vZGVsKQogICAgICArIEludGVycHJldGF0aW9uIGJpYXNlcwogICAgICArIFRvbGVyYW5jZSBvZiB1bmNlcnRhbnR5CiAgICAgICsgQ29nbml0aXZlIGVtb3Rpb25hbCBjb250cm9sCiAgICAgICsgZW1vdGlvbmFsIGF0dGVudGlvbmFsIGNvbnRyb2wgCiAgICAgICsgU0VTPwogICAgICArIEdlbmRlcj8gICAgCiAgICAgIAoKNC4gIFJ1biBhbGwgbW9kZWxzIGFnYWluIGluIEZMQVJlIFRFRFMKICAgICAgKyBEZWNpZGUgaWYgdGhlIHNhbWUgbW9kZWwgYmVzdCBmaXRzIHRoZSBkYXRhIGFnYWluLgogICAgICArIFNlZSBpZiB3ZSBnZXQgc2ltaWxhciByZXN1bHRzIGZyb20gdGhlIHBhcmFtZXRlciBwcmVkaWN0aW9uICAgCiAgICAgIAogICAgCgoKV2lsbCB1c2UgYSBjb21iaW5hdGlvbiBvZiBgUi5WZXJzaW9uKDMuNS4xKWAsIGBSU3RhbiAoVmVyc2lvbiAyLjE4LjIsIEdpdFJldjogMmUxZjkxM2QzY2EzKWAgYW5kIGBoQmF5ZXNETSBwYWNrYWdlIGluIFIgKDMuNS4xKWAgW0FobiwgVy4tWS4sIEhhaW5lcywgTi4sICYgWmhhbmcsIEwuICgyMDE3KS4gUmV2ZWFsaW5nIG5ldXJvLWNvbXB1dGF0aW9uYWwgbWVjaGFuaXNtcyBvZiByZWluZm9yY2VtZW50IGxlYXJuaW5nIGFuZCBkZWNpc2lvbi1tYWtpbmcgd2l0aCB0aGUgaEJheWVzRE0gcGFja2FnZS4gQ29tcHV0YXRpb25hbCBQc3ljaGlhdHJ5LCAxLCAyNC01Ny5dKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTYyL0NQU1lfYV8wMCksIHdoaWNoIHVzZXMgUlN0YW4KCgojIyBNb2RlbGxpbmcgbm90ZXMgey50YWJzZXR9CgojIyMgSW50dWl0aW9uCgoKRGlzY3Vzc2lvbiB3aXRoIFZpbmNlIFZhbHRvbiBhbmQgQWxleCBQaWtlIGFib3V0IHRoZSBiZXN0IHdheSB0byBmaXQgdGhpcyBtb2RlbC4gQXMgdGhlIG9ic2VydmVkIG91dGNvbWVzIChleHBlY3RhbmN5IHJhdGluZ3MpIGFyZSBub24gYmluYXJ5IGFuZCBhcmUgcmVsYXRlZCB0byBlYWNob3RoZXIgKGkuZS4gYXMgeW91IGJlY29tZSBtb3JlIGxpa2VseSB0byBzZWxlY3QgOSwgeW91IGJlY29tZSBsZXNzIGxpa2VseSB0byBzZWxlY3QgMSkgd2Ugc2hvdWxkIGNvbnNpZGVyIGVhY2ggdHJpYWwgZm9yIGVhY2ggcGVyc29uIGZvciBlYWNoIHN0aW11bHVzIGFzIGEgY29uc3RhbnRseSB1cGRhdGluZyBiZXRhIGRpc3RyaWJ1dGlvbi4gc28geW91IG1pZ2h0IHNlZSBhIHBhdHRlcm4gbGlrZSB0aGlzIGZvciB0aGUgQ1MrIGluIGFjcSBmb3IgZXhhbXBsZS4KClNvLCBiZXN0IG1vZGVsIGlzIGxpa2VseSB0byBiZSBvbmUgdXNpbmcgYmV0YSBkaXN0cmlidXRpb25zIHRoYXQgc2hvdyB0aGUgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIGZvciBlYWNoIHJhdGluZy4gCgpXZSBjYW4gdXNlIHN1ZmZpY2llbnQgcGFyYW1ldGVycyB0byBkZXNjcmliZSB0aGVzZSAoaS5lLiBtZWFuIC8gc2Qgb3IgcG9zc2libHkgdGhlIG1vZGUpCgpBIHVzZWZ1bCBpbnR1aXRpb24gb2YgdGhlIGJldGEgZGlzdHJpYnRpb24gY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwczovL3N0YXRzLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy80Nzc3MS93aGF0LWlzLXRoZS1pbnR1aXRpb24tYmVoaW5kLWJldGEtZGlzdHJpYnV0aW9uKQoKYW5kIGEgdXNlZnVsIHdlYnNpdGUgW2hlcmVdKGh0dHBzOi8vbWF0dGhld2RoYXJyaXMuY29tLzIwMTYvMTAvMTgvZXN0aW1hdGluZy1hLWJldGEtZGlzdHJpYnV0aW9uLXdpdGgtc3Rhbi1obWMvKQoKKnNjYWxpbmcqCgpXZSBjYW4gc2NhbGUgdGhlIGJldGEgYnkgaG93IGF2ZXJzaXZlIHBhcnRpY2lwYW50cyBmaW5kIHRoZSBzaG9jay4gaS5lLiBpdCBtaWdodCB1cGRhdGUgdGhlaXIgbGVhcm5pbmcgYXMgaWYgdGhlcmUgd2FzIC41IGEgc2hvY2sgb3IgMS41IG9mIGEgc2hvY2sgZGVwZW5kaW5nIG9uIHRoZWlyIG93biBzZW5zaXRpdml0eSB0byB0aGUgYXZlcnNpdmVuZXNzIC8gcHVuaXNobWVudC4KCiphbHBoYSoKCipnZW5lcmFsaXNhdGlvbioKCldlIGNhbiBkbyB0aGlzIHdpdGggYSBzaW5nbGUgYmV0YSBkaXN0cmlidXRpb24gZm9yIGVhY2ggcGhhc2UgKGNvbGxhcHNpbmcgb3ZlciB0aGUgdHdvIHN0aW11bGkpLiBUaGlzIHdvdWxkIGJlIGFraW4gdG8gYSBwZXIgcGhhc2UgZ2VuZXJhbGlzYXRpb24gcGFyYW1hdGVyZXIgaW4gdGhhdCBpdCB3aWxsIGJlIHNtYWxsZXIgaWYgdGhleSB0ZW5kIHRvIGNob29zZSB0aGUgc2FtZSBleHBlY3RhbmN5IGZvciBib3RoIHN0aW11bGkgYW5kIGxhcmdlciBpZiB0aGV5IHRlbmQgdG8gY2hvb3NlIHZlcnkgZGlmZmVyZW50bHkgZm9yIGJvdGggc3RpbXVsaS4gCgoqKipIb3dldmVyKioqLCBiZWNhdXNlIHRoZXNlIHZhcmlhYmxlcyBhcmUgbm90IHJlYWxseSBlcXVpdmFsZW50IChpLmUgdGhlIHJlaW5mb3JjZW1lbnQgcmF0ZSBpcyBkaWZmZXJlbnQgZm9yIGJvdGgsIGFuZCB3ZSB1c2UgdGhpcyBpbiB0aGUgbW9kZWwpICAgCgpTbyBpbnN0ZWFkIHdlIGNhbiBjcmVhdGUgYSBwYXJhbWF0ZXIgd2hpY2ggaXMgdGhlIHZhbHVlIG9mIGNzLSB3ZWlnaHRlZCBieSBzb21lIHZhbHVlIG9mIHRoZSBjcysuIEhvdyBtdWNoIGVhY2ggaW5kaXZpZHVhbCB3ZWlnaHRzIGJ5IHRoZSBDcysgY2FuIGJlIGZyZWVseSBlc3RpbWF0ZWQgYnkgdGhlIG1vZGVsIGFuZCBjYW4gYmUgdGhlIGdlbmVyYWxpc2F0aW9uIHBhcmFtdGVyLgoKU28gdGhpcyB3b3VsZCBiZSB2bWludXMgPSB2bWludXMgKyAodyl2cGx1cyAod2hlcmUgdGhlIHcgcGFyYW10ZXIgaXMgdGhlIGZyZWVseSBlc3RpbWF0ZWQgcGFyYW10ZXIgcGVyIHBlcnNvbikKCgoqcGVyIHN0aW11bHVzKgpXZSBwcm9iYWJseSB3YW50IHRvIG1vZGVsIGNzKyBhbmQgY3MtIHNlcGFyYXRlbHkgdG9vIC0gc28gaGF2ZSBhIGJldGEgZGlzdHJpYnV0aW9uIGNoYXJhY3RlcmlzZWQgYnkgc3VmZmljaWVudCBwYXJhbWV0ZXJzIGZvciBlYWNoLgoKCgoqcGVyIHRyaWFsKgoKQWxsIG9mIHRoZSBhYm92ZSBjYW4gdGhlbiBhbHNvIGJlIGRvbmUgd2l0aCB1cGRhdGluZyBwZXIgdHJpYWwuIAoKKmxlYWt5IGJldGEqCgp3ZSBhbHNvIG5lZWQgYSBtb2RlbCB0aGF0IGluY29ycG9yYXRlcyAnbGVhaycuICoqaS5lLioqIGxlYXJuaW5nIGxlYWsgLSBsaWtlbHkgdGhhdCBwYXJ0aWNpcGFudHMgd2lsbCB1cGRhdGUgbW9yZSBiYXNlZCBvbiBtb3JlIHJlY2VudCB0cmlhbHMgYW5kIGxlYXJuIGxlc3MgZnJvbSB0aGUgbW9yZSBkaXN0YW50IHRyaWFscyBhcyB0aW1lIHByb2dyZXNzZXMuIFNlZSBUb2J5J3MgcGFwZXIgIVtoZXJlXSgvVXNlcnMva2lyc3Rpbi9Ecm9wYm94L1NHRFAvRkxBUmUvUERGcy91bmNlcnRhaW50eV9hdHRlbnRpb25fcGFwZXJfUExvU0NCLnBkZikgZm9yIG1vcmUuIAoKKnVuY2VydGFpbnR5KgoKV2Ugc2hvdWxkIGNvbnNpZGVyIGluY29ycG9ydGF0aW5nIGEgcGFyYW10ZXIgdGhhdCBtYXBzIHRvIHBhcnRpY2lwYW50IHVuY2VydGFpbnR5IGFib3V0IG91dGNvbWVzLiAKCiphbnhpZXR5KgoKTWlnaHQgYmUgd29ydGggaW5jb3Jwb3JhdGluZyB0aGlzIGFzIGEgbW9kZWwgcGFyYW1hdGVyIC8gZmVhdHVyZS4gUmVhZCB0aGlzIGZvciBtb3JlLgoKW0h5cG90aGVzZXMgQWJvdXQgdGhlIFJlbGF0aW9uc2hpcCBvZiBDb2duaXRpb24gV2l0aCBQc3ljaG9wYXRob2xvZ3kgU2hvdWxkIGJlIFRlc3RlZCBieSBFbWJlZGRpbmcgVGhlbSBJbnRvIEVtcGlyaWNhbCBQcmlvcnMgKE1vdXRvdXNzaXN0IGV0IGFsLiwgMjAxOCldKGh0dHBzOi8vd3d3LmZyb250aWVyc2luLm9yZy9hcnRpY2xlcy8xMC4zMzg5L2Zwc3lnLjIwMTguMDI1MDQvZnVsbCkKCiMjIyBMb2cgbGlrZWxpaG9vZCBub3RlcwoKQXMgd2UgYXJlIHVzaW5nIGEgYmV0YSBkaXN0cmlidXRpb24sIHdlIHdpbGwgY2FsY3VsYXRlIGxvZyBsaWtlbGlob29kIGJhc2VkIG9uIHRoZSBwcm9iYWJpbGl0eSBmdW5jdGlvbiBmb3IgdGhlIGRpc3RyaWJ1dGlvbiAoaS5lLiB3aGVyZSB3aWxsIHRoZSBwZWFrIG9mIHRoZSBzaGFwZSBiZSkgZ2l2ZW4gdGhlIHBhcnRpY2lwYW50cyByZXNwb25zZSBhdCBlYWNoIHRyaWFsLiBTbyB3aWxsIGFkZCB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBnaXZlbiBlYWNoIHRyaWFsIHJlc3BvbnNlIHRyaWFsIGJ5IHRyaWFsIGZvciBlYWNoIG9mIHRoZSBDUysgYW5kIC0gc3VtbWVkIHRvZ2V0aGVyLgoKV2lsbCBvYnRhaW4gMSBsb2cgbGlrZWxpaG9vZCBhbmQgdGhlbiAxIHBlciB0cmlhbCBhbmQgYWRkIHRvZ2V0aGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXNlIGFyZSBjb21wYXJhYmxlLgoKCnRoZSBiYXNpYyBzdGFuIHRlcm1pbm9sb2d5IGZvciB0aGlzIGlzIGJlbG93OiAKCj4+IGJldGFfbHBkZihyYXRpbmdbdCxwXXxzaGFwZTFbdCxwXSxzaGFwZTJbdCxwXSkKCndoZXJlIGJldGFfbHBkZiBpcyB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBnaXZlbiB0aGUgcmF0aW5nIG1hZGUgYW5kIGVhY2ggb2YgdGhlIHR3byBiZXRhIGRpc3RyaWJ1dGlvbiBzaGFwZSBwYXJhbXRlcnMgdGhhdCB3ZSBlc3RpbWF0ZS4KClRoaXMgaXMgd2hhdCB3ZSB3aWxsIHVzZSB0byBjb21wYXJlIG1vZGVscy4KCiMjIyBUZXJtaW5vbG9neQoKKlYqID09ICd2YWx1ZScuIEJhYXNpY2FsbHkgYSBwYXJhbXRlciB0aGF0IGlzIGFib3V0IHRoZSBzYWxpZW5jZSBvZiB0aGUgc3RpbXVsdXMgYXQgYW55IGdpdmVuIHBvaW50LiAgICAKKmFscGhhKiA9PSAnbGVhcm5pbmcgcmF0ZScuIEEgcGFyYW1ldGVyIHRoYXQgZGVzY3JpYmVzIGhvdyBzZW5zaXRpdmUgcGVvcGxlIGFyZSB0byB1cGRhdGluZyB0aGVpciBsZWFybmluZy4gU28gYSBmYXN0IGxlYXJuaW5nIHJhdGUgbWVhbnMgdGhhdCBsZWFybmluZyBvbiBhbnkgZ2l2ZW4gdHJpYWwgaXMgd2VpZ2h0ZWQgbW9yZSBiYXNlZCBvbiB0aGUgdHJpYWxzIGltbWVkaWF0bHkgcHJlY2VkaW5nIHRoYW4gcGFzdCBvbmVzLCBhbmQgYSBzbG93IGxlYXJuaW5nIHJhdGUgbWVhbnMgdGhhdCBhbGwgcGFzdCBldmVudHMgaW5mbHVlbmNlIGxlYXJuaW5nIG1vcmUgZXZlbmx5LiAgQWxleCdzIHRlbm5pcyBhbmFsb2d5IGlzIGdvb2QgaGVyZSAoRmVkZXJlciAtIHN0YWJsZSBwbGF5ZXIsIGNhbiBwcmVkaWN0IGEgd2luIGJhc2VkIG9uIGFsbCBtYXRjaGVzOyBNdXJyYXkgLSB2b2xhdGlsZSBwbGF5ZXI7IGhpcyBsYXN0IG1hdGNoIGlzIGJlc3QgcHJlZGljdG9yIG9mIG5leHQgbWF0Y2ggcGVyZm9ybWFuY2UpLiAKKmJldGEqID09ICdjb25maWRlbmNlJy4gVGhpcyBpcyBzb3J0IG9mIGFuIGVycm9yIHRlcm0gLSBob3cgbXVjaCB2YXJpYW5jZSBpbiByYXRpbmcgY2hvaWNlIGlzIHRoZXJlIGZvciBlYWNoIHBlcnNvbi90cmlhbC4gQ2FuIGJlIHRob3VnaHQgb2YgYXMgdGhlIHZhcmlhbmNlLCBvciBiZXRhXjIgYXMgdGhlIHNkLiAgIAoKQ2FuIGJlIGNvbmZ1c2luZyBhcyB3ZSBhcmUgdXNpbmcgYmV0YSBkaXN0cmlidXRpb25zIChkaWZmZXJlbnQgdGhpbmcpIHdoaWNoIGhhcyB0d28gc3VmZmljaWVudCBwYXJhbWV0ZXJzIGEgKyBiKS4KCiMjIyBCZXRhIGRpc3RyaWJ1dGlvbiB2aXN1YWxpc2F0aW9uCgphbmQgaG93IHRoZXkgY2hhbmdlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBjaGFuZ2UgdGhlIGJldGEgb3IgYWxwaGEgcGFyYW10ZXJzLgoKIVtBIHJlYWxseSBuaWNlIHN1bW1hcnkgdmlzdWFsaXNhdGlvbl0oL1VzZXJzL2tpcnN0aW4vRHJvcGJveC9TY3JlZW5zaG90cy9iZXRhX2Rpc3QucG5nKQoKSGVyZSBhcmUgc29tZSBzaW11bGF0aW9ucyBJIGNhbiBjaGFuZ2UgYW5kIHBsYXkgd2l0aCB0aGUgaWxsdXN0cmF0ZSB0aGUgc2FtZSBzb3J0IG9mIHRoaW5nLiAKCgpgYGB7cixlY2hvPUZ9CnggPC0gc2VxKDAsIDEsIGxlbmd0aCA9IDIxKQpkYmV0YSh4LCAxLCAxKQpwYmV0YSh4LCAxLCAxKQoKIyMgVmlzdWFsaXphdGlvbiwgaW5jbHVkaW5nIGxpbWl0IGNhc2VzOgpwbC5iZXRhIDwtIGZ1bmN0aW9uKGEsYiwgYXNwID0gaWYoaXNMaW0pIDEsIHlsaW0gPSBpZihpc0xpbSkgYygwLDEuMSkpIHsKICBpZihpc0xpbSA8LSBhID09IDAgfHwgYiA9PSAwIHx8IGEgPT0gSW5mIHx8IGIgPT0gSW5mKSB7CiAgICBlcHMgPC0gMWUtMTAKICAgIHggPC0gYygwLCBlcHMsICgxOjcpLzE2LCAxLzIrYygtZXBzLDAsZXBzKSwgKDk6MTUpLzE2LCAxLWVwcywgMSkKICB9IGVsc2UgewogICAgeCA8LSBzZXEoMCwgMSwgbGVuZ3RoID0gMTAyNSkKICB9CiAgZnggPC0gY2JpbmQoZGJldGEoeCwgYSxiKSwgcGJldGEoeCwgYSxiKSwgcWJldGEoeCwgYSxiKSkKICBmIDwtIGZ4OyBmW2Z4ID09IEluZl0gPC0gMWUxMDAKICBtYXRwbG90KHgsIGYsIHlsYWI9IiIsIHR5cGU9ImwiLCB5bGltPXlsaW0sIGFzcD1hc3AsCiAgICAgICAgICBtYWluID0gc3ByaW50ZigiW2RwcV1iZXRhKHgsIGE9JWcsIGI9JWcpIiwgYSxiKSkKICBhYmxpbmUoMCwxLCAgICAgY29sPSJncmF5IiwgbHR5PTMpCiAgYWJsaW5lKGggPSAwOjEsIGNvbD0iZ3JheSIsIGx0eT0zKQogIGxlZ2VuZCgidG9wIiwgcGFzdGUwKGMoImQiLCJwIiwicSIpLCAiYmV0YSh4LCBhLGIpIiksCiAgICAgICAgIGNvbD0xOjMsIGx0eT0xOjMsIGJ0eSA9ICJuIikKICBpbnZpc2libGUoY2JpbmQoeCwgZngpKQp9CgojIyBjaGFuZ2UgYWxwaGEKCnByaW50KCJzdGFibGUgYmV0YSwgaW5jcmVhc2luZyBhbHBoYSIpCnBsLmJldGEoNSwgNSkKcGwuYmV0YSg4LCA1KQpwbC5iZXRhKDEwLCA1KQpwbC5iZXRhKDEyLCA1KQpwbC5iZXRhKDE4LCA1KQoKCiMjIGNoYW5nZSBiZXRhCnByaW50KCJzdGFibGUgYWxwaGEsIGluY3JlYXNpbmcgYmV0YSIpCnBsLmJldGEoNSwgNSkKcGwuYmV0YSg1LCA4KQpwbC5iZXRhKDUsIDEwKQpwbC5iZXRhKDUsIDEyKQpwbC5iZXRhKDUsIDE1KQoKCmBgYAoKIyMjIE1vZGVscyB0byB3cml0ZSAvIHJ1bgoKV2lsbCBwcm9iYWJseSBkbyBhbGwgcGVyIHRyaWFsLiBXaWxsIGRvIGFuIGVhcmx5IHNlbnNpdGl2aXR5IGNoZWNrIHRvIGNvbmZpcm0gdGhpcy4KCgoxLiAgU2luZ2xlIGJldGEsIG5vIHNjYWxpbmcgICAKMi4gIFNpbmdsZSBiZXRhLCBubyBzY2FsaW5nIHBlciB0cmlhbC4gICAKKioqIEF0IHRoaXMgcG9pbnQsIGNvbXBhcmUgdGhlIHR3byBhYm92ZS4gRW5zdXJlIHRoZSBwZXIgdHJpYWwgZml0cyBiZXR0ZXIsIGFuZCBpZiBpdCBkb2VzIHRoZW4gZG8gYWxsIGJlbG93IHBlciB0cmlhbCoqKiAgIAozLiAgIiIgc2NhbGVkIAo0LiAgU2luZ2xlIGJldGEgU2luZ2xlIGFscGhhIHJlaW5mb3JjZW1lbnQgbGVhcm5pbmcgbW9kZWwgKGVzdGltYXRlIGJvdGggdGhlIGJldGEgYW5kIHRoZSBhbHBoYSAqaS5lLiogbGVhcm5pbmcgcmF0ZSkKNS4gIFNpbmdsZSBiZXRhIHNpbmdsZSBhbHBoYSByZWluZm9yY2VtZW50IGxlYXJuaW5nIHdpdGggbWVhbiArIHNkIGZvciB0aGUgYmV0YSBlc3RpbWF0ZSBhcyBhIHBhcmFtdGVyCjYuICBCZXRhIHBlciBzdGltdWx1cyAgIAo3LiAgQmV0YSBwZXIgc3RpbXVsdXMgKyBnZW5lcmFsaXNhdGlvbiBwYXJhbXRlciAoVm1pbnVzID0gdm1pbnVzICsgd3ZwbHVzKSAgIAo4LiAgTGVha3kgYmV0YSAgIAo5LiAgTGVha3kgYmV0YSArIHVuY2VydGFpbnR5ICAgCjEwLiAgTGVha3kgYmV0YSArIHVuY2VydGFpbnR5ICsgYW54aWV0eSAgICAKCiMjIyBKdXN0aWZpY2F0aW9uIG9mIG1vZGVsIGNvbXBvbmVudHMKCipBbHBoYSoKTGVhcm5pbmcgcmF0ZSBwYXJhbXRlci4gSWYgaGlnaCB0aGVuIHdpbGwgYmUgdmVyeSBpbmZsdWVuY2VkIGJ5IHByZXZpb3VzIHRyaWFsIGV2ZW50cywgaWYgbG93LCB0aGVuIHdpbGwgYmUgbW9yZSBzdGFuZGFyZGx5IGluZmx1ZW5jZWQgYnkgYWNjdW11bGF0aW5nIGV2ZW50cy4KCiogU2luZ2xlIGFscGhhIHBlciBwZXJzb24gCiAgICAqIEFzc3VtZXMgdGhhdCBsZWFybmluZyByYXRlIGlzIGEgY29uc3RhbnQgZm9yIGVhY2ggaW5kaXZpZHVhbCB0aGF0IG1pZ2h0IGJlIHNjYWxlZCBieSBvdGhlciBmYWN0b3JzLCBzdWNoIGFzIGNlcnRhaW50eSBvciBzZW5zaXRpdml0eS4KCipCZXRhcyoKVmFyaWFuY2UvY2VydGFpbnR5IHBhcmFtZXRlcgoKKiBTaW5nbGUgYmV0YSBwZXIgcGVyc29uICAgCiAgICAqICAgQXNzdW1lcyB0aGF0IHRoZSBnZW5lcmFsIHZhcmlhbmNlIGFyb3VuZCByYXRpbmdzIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2Ygc3RpbXVsdXMuIGkuZS4gYXMgbXVjaCB1bmNlcnRhaW50eSBmb3IgQ1MrIGFzbiBDUy0KKiBUd28gYmV0YSdzIHBlciBwZXJzb24KICAgICogQXNzdW1lcyB0aGF0IGNvbmZpZGVuY2UgLyB1bmNlcnRhaW50eSBtaWdodCBkaWZmZXIgYnkgc3RpbXVsdXMuIFByZXN1bWFibHkgYXMgYSBmYWN0b3Igb2YgcmVpbmZvcmNlbWVudCByYXRlLgoKCgojIEFuYWx5c2VzCgojIyBTZXQgdXAgc3RhbiAKCgpUaGVzZSB1c2UgQWxleCBQaWtlcyBSU3RhbiBzY3JpcHQgd2l0aCBtaW5vciBtb2RpZmljYXRpb24gdG8gbWFrZSBpdCBwdW5pc2htZW50IG9ubHkgdG8gc2VlIGlmIGl0IHJ1bnMuIFRlc3RpbmcgdGhhdCB0aGUgYXBwcm9hY2ggd29ya3Mgd2l0aCB0aGUgY3VycmVudCBkYXRhIHNldCB1cCBldGMuICAKClRoZSBzZXR0aW5ncyBmb3IgdGhlIHNjcmlwdCBhcmUgYmVsb3csIGluY2x1ZGluZyBzdGFuIGNoYWluIHBhcmFtdGVycyBhbmQgZGlyZWN0b3J5IHNldCB1cC4KCgpgYGB7ciwgZWNobz1GLHJlc3VsdHM9Rn0KCiNybShsaXN0PWxzKCkpCgpsaWJyYXJ5KHRpYmJsZSkKCiMgZGlyZWN0b3JpZXMKd29ya2luZ2Rpcj0nL1VzZXJzL2tpcnN0aW4vRHJvcGJveC9TR0RQL0ZMQVJlL0ZMQVJlX01BU1RFUi9Qcm9qZWN0cy9IaWVyYWNoYWxfbW9kZWxsaW5nL01vZGVsbGluZycKc2NyaXB0ZGlyPScvVXNlcnMva2lyc3Rpbi9Ecm9wYm94L1NHRFAvRkxBUmUvRkxBUmVfTUFTVEVSL1Byb2plY3RzL0hpZXJhY2hhbF9tb2RlbGxpbmcvU2NyaXB0cycKZGF0YWRpcj0nL1VzZXJzL2tpcnN0aW4vRHJvcGJveC9TR0RQL0ZMQVJlL0ZMQVJlX01BU1RFUi9Qcm9qZWN0cy9MYXRlbnRHcm93dGgvRGF0YXNldHMvJwoKIyMgd3JpdGUgZnVuY3Rpb24gdG8gc2V0IGVhY2ggYmxvY2sgYXMgdGVzdCBvciBub3QgaW5kaXZpZHVhbGx5LgojIyB0aHJlZSB0ZXN0aW5nIGxldmVscyAtIG1pbiwgbWVkLCBtYXguIAojIyBpZiBvZmYsIHRoZW4gd2lsbCBzZXQgdG8gbm9ybWFsIHN0YW4gcGFyYW10ZXIgb2YgMTAwMCB3YXJtdXAgYW5kIDQwMDAgaXRlcmF0aW9ucyBvbiA0IGNoYWlucwoKdGVzdGluZyA8LSBmdW5jdGlvbih4KSB7CiAgCiAgaWYgKHggJWluJSBjKCdtaW4nLCJNaW4iKSkgewogICAgY2hhaW5faXRlcjw8LTQwMAogICAgd2FybV91cDw8LTEwMAogICAgY2hhaW5fbjw8LTEKICB9IGVsc2UgaWYgKCB4ICVpbiUgYygnbWVkJyAsJ01lZCcpKSB7CiAgICAKICAgIGNoYWluX2l0ZXI8PC0xMDAwCiAgICB3YXJtX3VwPDwtNTAwCiAgICBjaGFpbl9uPDwtMQogICAgCiAgfSBlbHNlIGlmICggeCAlaW4lIGMoJ21heCcsJ01heCcpKSB7CiAgICAKICAgIGNoYWluX2l0ZXI8PC0yMDAwCiAgICB3YXJtX3VwPDwtMTAwMAogICAgY2hhaW5fbjw8LTIKICAgIAogIH0gZWxzZSBpZiAoIHggJWluJSBjKCdvZmYnICwnT2ZmJykpIHsKICAgIAogICAgY2hhaW5faXRlcjw8LTQwMDAKICAgIHdhcm1fdXA8PC0xMDAwCiAgICBjaGFpbl9uPDwtNAogICAgCiAgfSBlbHNlIGlmICggeCAlaW4lIGMoJ3NraXAnICwnU2tpcCcpKSB7CiAgICAKICAgIGNoYWluX2l0ZXI8PC0wCiAgICB3YXJtX3VwPDwtMAogICAgY2hhaW5fbjw8LTAKICAgIAogIH0gCgp9CgpvdXRfZGVzY3JpYmU8LSBmdW5jdGlvbihzdW1tYXJ5KXsKICAKbGlicmFyeShwc3ljaCkKcHJpbnQocGFzdGUwKGNoYWluX2l0ZXIsICIgaXRlcmF0aW9ucyAiLCAnIG9uICcsIGNoYWluX24sJyBjaGFpbnMuJyxzZXA9IiAiKSkKCnByaW50KHBhc3RlKCJFc3RpbWF0ZWQiLChkaW0oc3VtbWFyeSRzdW1tYXJ5KVsxXS0xKSAvIDM0MiwiRnJlZSBwYXJhbWF0ZXJzIHBlciBwZXJzb24iLHNlcD0iICIpKQpwcmludCgiICIpCnByaW50KCdBdmVyYWdlIFJoYXQnKQpwcmludChtZWFuKCFpcy5uYShzdW1tYXJ5JHN1bW1hcnlbLDEwXSkpKQoKY291bnQgPC0gMQoKd2hpbGUgKGNvdW50IDwgKGRpbShzdW1tYXJ5JHN1bW1hcnkpWzFdLTEpKXsKICAKICBwcmludChyb3cubmFtZXMoc3VtbWFyeSRzdW1tYXJ5KVtjb3VudF0pCiAgcHJpbnQoIiAiKQogIHByaW50KGRlc2NyaWJlKChzdW1tYXJ5JHN1bW1hcnlbY291bnQ6KGNvdW50KzM0MSksMV0pKSkKICBwcmludCgiICIpCiAgY291bnQgPC0gY291bnQrMzQyCgp9Cgp9CgojIGNyZWF0ZSB0aGUgbiB0cmlhbHMgdmFyaWFibGUgZm9yIFJTdGFuCm50cmlhbHM9MTIKCiMjIGNhbm9uaWNhbCBCSUMgZnVuY3Rpb24gKEFsZXggUGlrZXMpCgpiaWM8LWZ1bmN0aW9uKHRyaWFscyxuZWdfbG9nX2xpa2UsbnBhcmFtKSB7CiAgaWYgKHN1bShuZWdfbG9nX2xpa2U8MCk+MCl7cHJpbnQoJ2NoZWNrIHRoaXMgaXMgbmVnYXRpdmUgbG9nIGxpa2VsaWhvb2QhIScpfSAKICAyKm5lZ19sb2dfbGlrZStucGFyYW0qbG9nKHRyaWFscykgI2Nhbm9uaWNhbAp9CgpgYGAKClRoaXMgbG9hZHMgdGhlIGxpYnJhcmllcyBhbmQgc291cmNlIGZpbGVzIG5lZWRlZCB0byBydW4gdGhpcyBzY3JpcHQsIGFuZCBzZXRzIHVwIFJTdGFuCgpgYGB7ciwgZWNobyA9IEYscmVzdWx0cz0naGlkZScsbWVzc2FnZT1GfQoKIyBsaWJyYXJpZXMgYW5kIHNvdXJjZSBmaWxlcyAKbGlicmFyeSgnTUFTUycpCmxpYnJhcnkoJ2Jvb3QnKQpsaWJyYXJ5KCdkcGx5cicpCmxpYnJhcnkoJ3Jlc2hhcGUnKQpsaWJyYXJ5KCd0aWR5cicpCmxpYnJhcnkoJ3JzdGFuJykgCmxpYnJhcnkoJ2xvbycpICAgICMgdGhpcyBpcyBtb2RlbCBjb21wYXJpc29uIHBhY2thZ2UuIGhlbHBzIGV4dHJhY3QgbG9nbGlrZWxpaG9vZCB0b28uCmxpYnJhcnkoJ2RhdGEudGFibGUnKQoKI29wdGlvbnMgZm9yIFJTVEFOCm9wdGlvbnMobWMuY29yZXMgPSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKSkKcnN0YW5fb3B0aW9ucyhhdXRvX3dyaXRlID0gVFJVRSkKU3lzLnNldGVudihMT0NBTF9DUFBGTEFHUyA9ICctbWFyY2g9bmF0aXZlJykKU3lzLmdldGVudignTE9DQUxfQ1BQRkxBR1MnKSAjc2hvdWxkIHNheSAnLW1hcmNoPW5hdGl2ZScKCiNmdW5jdGlvbnMgKGlmIGFuZCB3aGVuIHJlbGV2YW50IGFuZCBhZGRlZCkKIyBzb3VyY2UoJy9Vc2Vycy9raXJzdGluL0Ryb3Bib3gvU0dEUC9GdW5jdGlvbl9saWJyYXJ5Lzw8ZnVuY3Rpb24gc2NyaXB0IG5hbWU+PicpCnNvdXJjZSgnL1VzZXJzL2tpcnN0aW4vRHJvcGJveC9TR0RQL0Z1bmN0aW9uX2xpYnJhcnkvbm90X2luLlInKSAjIE5vdCBpbiAlIWluJSBmdW5jdGlvbgoKYGBgCgojIyBQcmVsaW1pbmFyeSB7LnRhYnNldH0KCiMjIyBDb21wYXJlIGEgcHJpb3JpIHRvIGRhdGEgey50YWJzZXR9CgojIyMjIFNpbXVsYXRlIGRpZmZlcmVudCBsZWFybmluZyByYXRlcyB7LnRhYnNldH0KCm9ubHkgZG9pbmcgdGhpcyAnYWNjdXJhdGVseScgZm9yIHRoZSBhY3F1aXNpdGlvbiBDUyssIGFzIHRoZSBzaW11bGF0aW9ucyByZXF1aXJlIHByb2JhYmlsaXR5LiBJIGFtIHVzaW5nIGNvbnRpbmdlbmN5IGZvciB0aGlzICgwLjc1KS4gSWYgc2V0IGZvciAwIGZvciBhbGwgb3RoZXIgcGhhc2VzIGFuZCBzdGltdWxpIHRoZW4gaXQgbG9va3MgYXMgaWYgdGhlIGxlYXJuaW5nIHNob3VsZCBiZSBmbGF0IHJlZ2FyZGxlc3Mgb2YgYWxwaGEuIFdlIGV4cGVjdCBpbiByZWFsaXR5IHRoYXQgdGhpcyBwcm9iYWJpbGl0eSB3aWxsIHZhcnkgYmV0d2VlbiBwZW9wbGUgYW5kIHdpbGwgYmUgdW5saWtlbHkgdG8gYmUgemVyby4gU28gdGVzdCAxMiBhbmQgMTggdHJpYWxzIHdpdGggYSBwcm9iYWJpbGl0eSBvZiAwLjUgYW5kIDAuMiBhcyB3ZWxsLgoKIyMjIyMgIDEyIHRyaWFsczsgcHJvYmFiaWxpdHkgPSAwLjc1CgpgYGB7cixlY2hvPUZ9CiN0aGlzIGlzIGEgdmVyeSBiYXNpYyBzY3JpcHQKI2NyZWF0ZWQgYnkgQWxleCBQaWtlIDE0LzAyLzE5CiNpdCBzaW11bGF0ZXMgdGhlIGxlYXJuaW5nIG9mIHRoZSB2YWx1ZSAoUSkgb2YgYSByZXdhcmRlZCBzdGltdWx1cwojYWxwaGEgaXMgdGhlIGxlYXJuaW5nIHJhdGUKI250cmlhbHMgaXMgdGhlIG51bWJlciBvZiB0cmlhbHMgaW4gdGhlIHRhc2sKIydvdXRjb21lX3Byb2JhYmlsaXN0aWMnIGdlbmVyYXRlcyBvdXRjb21lcyBwcm9iYWJpbGlzdGljYWxseSBmb3IgbnRyaWFscwojJ291dGNvbWVfZGV0ZXJtaW5pc3RpYycgYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRjb21lICgxKQoKCgojIyBrbHAgQUNRIENTcCBzaW1zCgpuX3RyaWFscyA9IDEyCnByb2JhYmlsaXR5ID0gMC43NTsgI2VkaXQgdGhpcyB0byBjaGFuZ2UgdGhlIHByb2JhYmlsaXR5IG9mIHJld2FyZAoKI2tscCAtIGxvb3AgdGhyb3VnaCBzb21lIGRpZmZlcmVudCBsZWFybmluZyByYXRlcwoKcHJpbnQoIlNpbXVsYXRlZCBsZWFybmluZyByYXRlcy4gMTIgdHJpYWxzOyBwcm9iYWJpbGl0eSA9IDAuNzUgKENTcCBhY3EgY29udGluZ2VuY3kpIFxuIikKCmZvciAoYSBpbiBzZXEoMDowLjksYnk9MC4xKSkgewogIAogIGFscGhhIDwtIGEgICAjbGVhcm5pbmcgcmF0ZSAoYmV0d2VlbiAwIGFuZCAxKQogIApvdXRjb21lX2RldGVybWluaXN0aWMgPSByZXAoMSxuX3RyaWFscykKb3V0Y29tZV9wcm9iYWJpbGlzdGljID0gaWZlbHNlKHJ1bmlmKDEwMCk8cHJvYmFiaWxpdHksMSwwKQoKUT1yZXAoMCxuX3RyaWFscykKcGFyKG1mcm93PWMoMiwxKSkKZm9yICh0IGluIDE6KG5fdHJpYWxzLTEpKXsKICBRW3QrMV09UVt0XSthbHBoYSoob3V0Y29tZV9kZXRlcm1pbmlzdGljW3RdIC0gUVt0XSk7Cn0KcGxvdChRLHR5cGU9J2wnLGNvbD0nYmx1ZScseGxhYj0ndHJpYWwgbnVtYmVyJykKdGl0bGUoJ0RldGVybWluaXN0aWMnKQoKZm9yICh0IGluIDE6KG5fdHJpYWxzLTEpKXsKICBRW3QrMV09UVt0XSthbHBoYSoob3V0Y29tZV9wcm9iYWJpbGlzdGljW3RdIC0gUVt0XSk7Cn0KCgpwbG90KFEsdHlwZT0nbCcsY29sPSdyZWQnLHhsYWI9J3RyaWFsIG51bWJlcicpCnRpdGxlKCdQcm9iYWJpbGlzdGljJyxzdWI9cGFzdGUwKCJhbHBoYSA9ICIsYSxzZXA9IiAiKSkKCn0KCgpgYGAKIyMjIyMgIDEyIHRyaWFsczsgcHJvYmFiaWxpdHkgPSAwLjUKCgpgYGB7cixlY2hvPUZ9CgoKbl90cmlhbHMgPSAxMgpwcm9iYWJpbGl0eSA9IDAuNTsgI2VkaXQgdGhpcyB0byBjaGFuZ2UgdGhlIHByb2JhYmlsaXR5IG9mIHJld2FyZAoKI2tscCAtIGxvb3AgdGhyb3VnaCBzb21lIGRpZmZlcmVudCBsZWFybmluZyByYXRlcwoKcHJpbnQoIlNpbXVsYXRlZCBsZWFybmluZyByYXRlcy4gMTIgdHJpYWxzOyBQcm9iYWJpbGl0eSA9IDAuNVxuIikKCmZvciAoYSBpbiBzZXEoMDowLjksYnk9MC4xKSkgewogIAogIGFscGhhIDwtIGEgICAjbGVhcm5pbmcgcmF0ZSAoYmV0d2VlbiAwIGFuZCAxKQogIApvdXRjb21lX2RldGVybWluaXN0aWMgPSByZXAoMSxuX3RyaWFscykKb3V0Y29tZV9wcm9iYWJpbGlzdGljID0gaWZlbHNlKHJ1bmlmKDEwMCk8cHJvYmFiaWxpdHksMSwwKQoKUT1yZXAoMCxuX3RyaWFscykKcGFyKG1mcm93PWMoMiwxKSkKZm9yICh0IGluIDE6KG5fdHJpYWxzLTEpKXsKICBRW3QrMV09UVt0XSthbHBoYSoob3V0Y29tZV9kZXRlcm1pbmlzdGljW3RdIC0gUVt0XSk7Cn0KcGxvdChRLHR5cGU9J2wnLGNvbD0nYmx1ZScseGxhYj0ndHJpYWwgbnVtYmVyJykKdGl0bGUoJ0RldGVybWluaXN0aWMnKQoKZm9yICh0IGluIDE6KG5fdHJpYWxzLTEpKXsKICBRW3QrMV09UVt0XSthbHBoYSoob3V0Y29tZV9wcm9iYWJpbGlzdGljW3RdIC0gUVt0XSk7Cn0KCgpwbG90KFEsdHlwZT0nbCcsY29sPSdyZWQnLHhsYWI9J3RyaWFsIG51bWJlcicpCnRpdGxlKCdQcm9iYWJpbGlzdGljJyxzdWI9cGFzdGUwKCJhbHBoYSA9ICIsYSxzZXA9IiAiKSkKCn0KCmBgYAoKIyMjIyMgIDEyIHRyaWFsczsgcHJvYmFiaWxpdHkgPSAwLjIKCmBgYHtyLGVjaG89Rn0KCgpuX3RyaWFscyA9IDEyCnByb2JhYmlsaXR5ID0gMC4yOyAjZWRpdCB0aGlzIHRvIGNoYW5nZSB0aGUgcHJvYmFiaWxpdHkgb2YgcmV3YXJkCgoja2xwIC0gbG9vcCB0aHJvdWdoIHNvbWUgZGlmZmVyZW50IGxlYXJuaW5nIHJhdGVzCgpwcmludCgiU2ltdWxhdGVkIGxlYXJuaW5nIHJhdGVzLiAxMiB0cmlhbHM7IFByb2JhYmlsaXR5ID0gMC4yXG4iKQoKZm9yIChhIGluIHNlcSgwOjAuOSxieT0wLjEpKSB7CiAgCiAgYWxwaGEgPC0gYSAgICNsZWFybmluZyByYXRlIChiZXR3ZWVuIDAgYW5kIDEpCiAgCm91dGNvbWVfZGV0ZXJtaW5pc3RpYyA9IHJlcCgxLG5fdHJpYWxzKQpvdXRjb21lX3Byb2JhYmlsaXN0aWMgPSBpZmVsc2UocnVuaWYoMTAwKTxwcm9iYWJpbGl0eSwxLDApCgpRPXJlcCgwLG5fdHJpYWxzKQpwYXIobWZyb3c9YygyLDEpKQpmb3IgKHQgaW4gMToobl90cmlhbHMtMSkpewogIFFbdCsxXT1RW3RdK2FscGhhKihvdXRjb21lX2RldGVybWluaXN0aWNbdF0gLSBRW3RdKTsKfQpwbG90KFEsdHlwZT0nbCcsY29sPSdibHVlJyx4bGFiPSd0cmlhbCBudW1iZXInKQp0aXRsZSgnRGV0ZXJtaW5pc3RpYycpCgpmb3IgKHQgaW4gMToobl90cmlhbHMtMSkpewogIFFbdCsxXT1RW3RdK2FscGhhKihvdXRjb21lX3Byb2JhYmlsaXN0aWNbdF0gLSBRW3RdKTsKfQoKCnBsb3QoUSx0eXBlPSdsJyxjb2w9J3JlZCcseGxhYj0ndHJpYWwgbnVtYmVyJykKdGl0bGUoJ1Byb2JhYmlsaXN0aWMnLHN1Yj1wYXN0ZTAoImFscGhhID0gIixhLHNlcD0iICIpKQoKfQoKYGBgCgojIyMjIyAgMTggdHJpYWxzOyBwcm9iYWJpbGl0eSA9IDAuNQoKYGBge3IsZWNobz1GfQoKCm5fdHJpYWxzID0gMTgKcHJvYmFiaWxpdHkgPSAwLjU7ICNlZGl0IHRoaXMgdG8gY2hhbmdlIHRoZSBwcm9iYWJpbGl0eSBvZiByZXdhcmQKCiNrbHAgLSBsb29wIHRocm91Z2ggc29tZSBkaWZmZXJlbnQgbGVhcm5pbmcgcmF0ZXMKCnByaW50KCJTaW11bGF0ZWQgbGVhcm5pbmcgcmF0ZXMuIDE4IHRyaWFsczsgUHJvYmFiaWxpdHkgPSAwLjVcbiIpCgpmb3IgKGEgaW4gc2VxKDA6MC45LGJ5PTAuMSkpIHsKICAKICBhbHBoYSA8LSBhICAgI2xlYXJuaW5nIHJhdGUgKGJldHdlZW4gMCBhbmQgMSkKICAKb3V0Y29tZV9kZXRlcm1pbmlzdGljID0gcmVwKDEsbl90cmlhbHMpCm91dGNvbWVfcHJvYmFiaWxpc3RpYyA9IGlmZWxzZShydW5pZigxMDApPHByb2JhYmlsaXR5LDEsMCkKClE9cmVwKDAsbl90cmlhbHMpCnBhcihtZnJvdz1jKDIsMSkpCmZvciAodCBpbiAxOihuX3RyaWFscy0xKSl7CiAgUVt0KzFdPVFbdF0rYWxwaGEqKG91dGNvbWVfZGV0ZXJtaW5pc3RpY1t0XSAtIFFbdF0pOwp9CnBsb3QoUSx0eXBlPSdsJyxjb2w9J2JsdWUnLHhsYWI9J3RyaWFsIG51bWJlcicpCnRpdGxlKCdEZXRlcm1pbmlzdGljJykKCmZvciAodCBpbiAxOihuX3RyaWFscy0xKSl7CiAgUVt0KzFdPVFbdF0rYWxwaGEqKG91dGNvbWVfcHJvYmFiaWxpc3RpY1t0XSAtIFFbdF0pOwp9CgoKcGxvdChRLHR5cGU9J2wnLGNvbD0ncmVkJyx4bGFiPSd0cmlhbCBudW1iZXInKQp0aXRsZSgnUHJvYmFiaWxpc3RpYycsc3ViPXBhc3RlMCgiYWxwaGEgPSAiLGEsc2VwPSIgIikpCgp9CgpgYGAKCiMjIyMjICAxOCB0cmlhbHM7IHByb2JhYmlsaXR5ID0gMC4yCgpgYGB7cixlY2hvPUZ9CgoKbl90cmlhbHMgPSAxOApwcm9iYWJpbGl0eSA9IDAuMjsgI2VkaXQgdGhpcyB0byBjaGFuZ2UgdGhlIHByb2JhYmlsaXR5IG9mIHJld2FyZAoKI2tscCAtIGxvb3AgdGhyb3VnaCBzb21lIGRpZmZlcmVudCBsZWFybmluZyByYXRlcwoKcHJpbnQoIlNpbXVsYXRlZCBsZWFybmluZyByYXRlcy4gMTggdHJpYWxzOyBQcm9iYWJpbGl0eSA9IDAuMlxuIikKCmZvciAoYSBpbiBzZXEoMDowLjksYnk9MC4xKSkgewogIAogIGFscGhhIDwtIGEgICAjbGVhcm5pbmcgcmF0ZSAoYmV0d2VlbiAwIGFuZCAxKQogIApvdXRjb21lX2RldGVybWluaXN0aWMgPSByZXAoMSxuX3RyaWFscykKb3V0Y29tZV9wcm9iYWJpbGlzdGljID0gaWZlbHNlKHJ1bmlmKDEwMCk8cHJvYmFiaWxpdHksMSwwKQoKUT1yZXAoMCxuX3RyaWFscykKcGFyKG1mcm93PWMoMiwxKSkKZm9yICh0IGluIDE6KG5fdHJpYWxzLTEpKXsKICBRW3QrMV09UVt0XSthbHBoYSoob3V0Y29tZV9kZXRlcm1pbmlzdGljW3RdIC0gUVt0XSk7Cn0KcGxvdChRLHR5cGU9J2wnLGNvbD0nYmx1ZScseGxhYj0ndHJpYWwgbnVtYmVyJykKdGl0bGUoJ0RldGVybWluaXN0aWMnKQoKZm9yICh0IGluIDE6KG5fdHJpYWxzLTEpKXsKICBRW3QrMV09UVt0XSthbHBoYSoob3V0Y29tZV9wcm9iYWJpbGlzdGljW3RdIC0gUVt0XSk7Cn0KCgpwbG90KFEsdHlwZT0nbCcsY29sPSdyZWQnLHhsYWI9J3RyaWFsIG51bWJlcicpCnRpdGxlKCdQcm9iYWJpbGlzdGljJyxzdWI9cGFzdGUwKCJhbHBoYSA9ICIsYSxzZXA9IiAiKSkKCn0KCmBgYAoKCiMjIyMgUGxvdCBzdWJzZXQgb2YgdHJhamVjdG9yaWVzIGluIGZsYXJlCgpgYGB7cixlY2hvPUZ9CgoKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZHBseXIpCgpzYXZlIDwtICIvVXNlcnMva2lyc3Rpbi9Ecm9wYm94L1NHRFAvRkxBUmUvRkxBUmVfTUFTVEVSL1Byb2plY3RzL0xhdGVudEdyb3d0aC9GaWd1cmVzLyIKZGF0IDwtIGZyZWFkKCIvVXNlcnMva2lyc3Rpbi9Ecm9wYm94L1NHRFAvRkxBUmUvRkxBUmVfTUFTVEVSL1Byb2plY3RzL0xhdGVudEdyb3d0aC9EYXRhc2V0cy9GQ190MV9tcGx1c19kYXRhLmNzdiIsZGF0YS50YWJsZSA9IEYpCgojIyByYW5kb21seSBzZWxlY3QgMTAgaW5kaXZpZHVhbHMuCgpzZXQuc2VlZCgyMDE2KQpmaWxlIDwtIHNhbXBsZV9uKGRhdCwxMCkKCgphcCA8LSBzdWJzZXQoZmlsZSxzZWxlY3Q9YygiU3ViamVjdF9JRCIsIkZDVDFfMWV4cENTcF8xIiwgCiAgICAgICAgICAgICAiRkNUMV8xZXhwQ1NwXzIiLCAiRkNUMV8xZXhwQ1NwXzMiLCAiRkNUMV8xZXhwQ1NwXzQiLCAiRkNUMV8xZXhwQ1NwXzUiLCAKICAgICAgICAgICAgICJGQ1QxXzFleHBDU3BfNiIsICJGQ1QxXzFleHBDU3BfNyIsICJGQ1QxXzFleHBDU3BfOCIsICJGQ1QxXzFleHBDU3BfOSIsIAogICAgICAgICAgICAgIkZDVDFfMWV4cENTcF8xMCIsICJGQ1QxXzFleHBDU3BfMTEiLCAiRkNUMV8xZXhwQ1NwXzEyIikpCgphbSA8LSBzdWJzZXQoZmlsZSxzZWxlY3Q9YygiU3ViamVjdF9JRCIsIkZDVDFfMWV4cENTbV8xIiwgCiAgICAgICAgICAgICAiRkNUMV8xZXhwQ1NtXzIiLCAiRkNUMV8xZXhwQ1NtXzMiLCAiRkNUMV8xZXhwQ1NtXzQiLCAiRkNUMV8xZXhwQ1NtXzUiLCAKICAgICAgICAgICAgICJGQ1QxXzFleHBDU21fNiIsICJGQ1QxXzFleHBDU21fNyIsICJGQ1QxXzFleHBDU21fOCIsICJGQ1QxXzFleHBDU21fOSIsIAogICAgICAgICAgICAgIkZDVDFfMWV4cENTbV8xMCIsICJGQ1QxXzFleHBDU21fMTEiLCAiRkNUMV8xZXhwQ1NtXzEyIikpCgplcCA8LSBzdWJzZXQoZmlsZSxzZWxlY3Q9YygiU3ViamVjdF9JRCIsIkZDVDFfM2V4cENTcF8xIiwgIkZDVDFfM2V4cENTcF8yIiwgIkZDVDFfM2V4cENTcF8zIiwgCiAgICAgICAgICAgICAiRkNUMV8zZXhwQ1NwXzQiLCAiRkNUMV8zZXhwQ1NwXzUiLCAiRkNUMV8zZXhwQ1NwXzYiLCAiRkNUMV8zZXhwQ1NwXzciLCAKICAgICAgICAgICAgICJGQ1QxXzNleHBDU3BfOCIsICJGQ1QxXzNleHBDU3BfOSIsICJGQ1QxXzNleHBDU3BfMTAiLCAiRkNUMV8zZXhwQ1NwXzExIiwgCiAgICAgICAgICAgICAiRkNUMV8zZXhwQ1NwXzEyIiwgIkZDVDFfM2V4cENTcF8xMyIsICJGQ1QxXzNleHBDU3BfMTQiLCAiRkNUMV8zZXhwQ1NwXzE1IiwgCiAgICAgICAgICAgICAiRkNUMV8zZXhwQ1NwXzE2IiwgIkZDVDFfM2V4cENTcF8xNyIsICJGQ1QxXzNleHBDU3BfMTgiKSkKCmVtIDwtIHN1YnNldChmaWxlLHNlbGVjdD1jKCJTdWJqZWN0X0lEIiwiRkNUMV8zZXhwQ1NtXzEiLCAKICAgICAgICAgICAgICJGQ1QxXzNleHBDU21fMiIsICJGQ1QxXzNleHBDU21fMyIsICJGQ1QxXzNleHBDU21fNCIsICJGQ1QxXzNleHBDU21fNSIsIAogICAgICAgICAgICAgIkZDVDFfM2V4cENTbV82IiwgIkZDVDFfM2V4cENTbV83IiwgIkZDVDFfM2V4cENTbV84IiwgIkZDVDFfM2V4cENTbV85IiwgCiAgICAgICAgICAgICAiRkNUMV8zZXhwQ1NtXzEwIiwgIkZDVDFfM2V4cENTbV8xMSIsICJGQ1QxXzNleHBDU21fMTIiLCAiRkNUMV8zZXhwQ1NtXzEzIiwgCiAgICAgICAgICAgICAiRkNUMV8zZXhwQ1NtXzE0IiwgIkZDVDFfM2V4cENTbV8xNSIsICJGQ1QxXzNleHBDU21fMTYiLCAiRkNUMV8zZXhwQ1NtXzE3IiwgCiAgICAgICAgICAgICAiRkNUMV8zZXhwQ1NtXzE4IikpCgoKCiMjIG1lbHQgdG8gbG9uZ2Zvcm0KCmFwbXQgPC0gbWVsdChhcCwKICAgICAgICAgICBpZC52YXI9IlN1YmplY3RfSUQiKQphcG10IDwtIGFwbXRbKG9yZGVyKGFwbXQkU3ViamVjdF9JRCkpLF0KYXBtdCRUcmlhbCA8LSByZXAoMToxMikKCmFtbXQgPC0gbWVsdChhbSwKICAgICAgICAgICBpZC52YXI9IlN1YmplY3RfSUQiKQphbW10IDwtIGFtbXRbKG9yZGVyKGFtbXQkU3ViamVjdF9JRCkpLF0KYW1tdCRUcmlhbCA8LSByZXAoMToxMikKCmVwbXQgPC0gbWVsdChlcCwKICAgICAgICAgICBpZC52YXI9IlN1YmplY3RfSUQiKQplcG10IDwtIGVwbXRbKG9yZGVyKGVwbXQkU3ViamVjdF9JRCkpLF0KZXBtdCRUcmlhbCA8LSByZXAoMToxOCkKCmVtbXQgPC0gbWVsdChlbSwKICAgICAgICAgICBpZC52YXI9IlN1YmplY3RfSUQiKQplbW10IDwtIGVtbXRbKG9yZGVyKGVtbXQkU3ViamVjdF9JRCkpLF0KZW1tdCRUcmlhbCA8LSByZXAoMToxOCkKCiMjIHBsb3QgbGluZXMgYW5kIGJveCBwbG90cyBmb3IgdGhlIHN1YnNldAoKIyBhY3EgQ1MrCmFjcCA8LSBnZ3Bsb3QoYXBtdCwKICAgICAgICAgICAgICBhZXMoVHJpYWwsIHZhbHVlKSkgICAgICAgICAgICArCiAgZ2VvbV9ib3hwbG90KGFlcyhncm91cD12YXJpYWJsZSkpICAgICAgICAgKwogICAgZ2VvbV9saW5lKGFlcyhncm91cCA9IFN1YmplY3RfSUQsCiAgICAgICAgICAgICAgICAgIGNvbG9yPVN1YmplY3RfSUQpKSAgICAgICAgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvcnM9cmFpbmJvdygxMCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICAgICAgICAgICArCiAgZ2d0aXRsZSgiQ1MrIGFjcXVpc2l0aW9uIikKCiMgYWNxIENTLQphY20gPC0gZ2dwbG90KGFtbXQsCiAgICAgICAgICAgICAgYWVzKFRyaWFsLCB2YWx1ZSkpICAgICAgICAgICAgKwogIGdlb21fYm94cGxvdChhZXMoZ3JvdXA9dmFyaWFibGUpKSAgICAgICAgICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXAgPSBTdWJqZWN0X0lELAogICAgICAgICAgICAgICAgICBjb2xvcj1TdWJqZWN0X0lEKSkgICAgICAgICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3JzPXJhaW5ib3coMTApKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAgICAgICAgICAgKwogIGdndGl0bGUoIkNTLSBhY3F1aXNpdGlvbiIpCgoKIyBFeHQgQ1MrCmV4cCA8LSBnZ3Bsb3QoZXBtdCwKICAgICAgICAgICAgICBhZXMoVHJpYWwsIHZhbHVlKSkgICAgICAgICAgICArCiAgZ2VvbV9ib3hwbG90KGFlcyhncm91cD12YXJpYWJsZSkpICAgICAgICAgKwogICAgZ2VvbV9saW5lKGFlcyhncm91cCA9IFN1YmplY3RfSUQsCiAgICAgICAgICAgICAgICAgIGNvbG9yPVN1YmplY3RfSUQpKSAgICAgICAgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvcnM9cmFpbmJvdygxMCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICAgICAgICAgICArCiAgZ2d0aXRsZSgiQ1MrIEV4dGluY3Rpb24iKQoKIyBFeHQgQ1MtCmV4bSA8LSBnZ3Bsb3QoZW1tdCwKICAgICAgICAgICAgICBhZXMoVHJpYWwsIHZhbHVlKSkgICAgICAgICAgICArCiAgZ2VvbV9ib3hwbG90KGFlcyhncm91cD12YXJpYWJsZSkpICAgICAgICAgKwogICAgZ2VvbV9saW5lKGFlcyhncm91cCA9IFN1YmplY3RfSUQsCiAgICAgICAgICAgICAgICAgIGNvbG9yPVN1YmplY3RfSUQpKSAgICAgICAgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvcnM9cmFpbmJvdygxMCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICAgICAgICAgICArCiAgZ2d0aXRsZSgiQ1MtIEV4dGluY3Rpb24iKQoKYWNwCmFjbQpleHAKZXhtCmBgYAoKCiMjIyBUcnkgUlN0YW4KClNlZSBpZiB0aGUgYmFzaWMgcHVuaXNobWVudCBvbmx5IGxlYXJuaW5nIG1vZGVsIGZvciB0aGUgQ1MrIGFuZCBDUy0gd29ya3Mgd2l0aCB0aGUgRkxBUmUgbWFzdGVyIGRhdGEKCiMjIyMgUnVuIHRoZSA4c2Nob29scyBjaGVjawoKRnJvbSB0aGUgW3JzdGFuIGdpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL3N0YW4tZGV2L3JzdGFuL3dpa2kvUlN0YW4tR2V0dGluZy1TdGFydGVkKQoKVGhpcyBpcyB0byBjaGVjayB0aGF0IGFsbCBpcyBjb21waWxpbmcgYW5kIHdvcmtpbmcgYW5kIHRvIGdpdmUgYW5kIGlkZWEgb2YgZGF0YSBmb3JtYXQgZXRjLgoKCgojIyMjIEFkanVzdCBkYXRhZnJhbWUKCmxvYWQgaW4gdGhlIHdlZWsgMSBhcHAgYW5kIGxhYiBkYXRhIGZvciBGTEFSZSBwaWxvdCwgVFJUIGFuZCBoZWFkcGhvbmVzIHN0dWRpZXMuIE1ha2UgaXQgbG9uZyBmb3JtLgoKVHJ5IHdpdGggYWNxdWlzaXRpb24gZGF0YSBmaXJzdC4gVGhpcyBpcyBmb3JtYXR0ZWQgd2l0aCBubyBjb2x1bW4gbmFtZXMsIHdpdGggbm8gbWlzc2luZyBkYXRhLgoKRGVyaXZlIHRoZSBuIHBhcmFtZXRlciBmb3IgYm90aCBmaWxlcyBhbmQgY2hlY2sgdGhlc2UgbWF0Y2gKCmBgYHtyfQoKc3Rhbm5hbWU9J3B1bmlzaF9vbmx5LnN0YW4nCm1pbnVzX25hbWUgPC0gJ2JheWVzX2FjcV9taW51cy5jc3YnCnBsdXNfbmFtZSA8LSAiYmF5ZXNfYWNxX3BsdXMuY3N2IgoKc3RhbmZpbGUgPC0gZmlsZS5wYXRoKHNjcmlwdGRpciwgc3Rhbm5hbWUpCm1pbnVzZmlsZSA8LSBmaWxlLnBhdGgoZGF0YWRpcixtaW51c19uYW1lKQpwbHVzZmlsZSA8LSBmaWxlLnBhdGgoZGF0YWRpcixwbHVzX25hbWUpCgoKbWludXMgPC0gZnJlYWQobWludXNmaWxlLGRhdGEudGFibGU9RikKcGx1cyA8LWZyZWFkKHBsdXNmaWxlLGRhdGEudGFibGU9RikKCm5hY3FtIDwtIGRpbShtaW51cylbMV0KbmFjcXAgPC0gZGltKHBsdXMpWzFdCgoKIyMgY2hlY2sgdGhhdCB0aGVzZSBtYXRjaCBhbmQgY3JlYXRlIG5zdWIgdmFyaWFibGUgZm9yIFJTdGFuCgppZiAobmFjcW0gPT0gbmFjcXApIHsKICBwcmludCgnc3ViamVjdCBudW1iZXIgbWF0Y2gnKQogIG5zdWIgPC0gbmFjcW0KICAKICBwcmludChwYXN0ZSgnbnN1YiBzZXQgdG8nLG5zdWIsc2VwPSIgIikpCn0gZWxzZSB7CiAgcHJpbnQoJ1dBUk5JTkc6IHN1YmplY3QgbnVtYmVyIGRvZXMgbm90IG1hdGNoLiBDaGVjayBtYXN0ZXIgZGF0YXNldCcpCn0KCiMgY2hlY2sgdGhlIGZpbGUgZm9ybWF0IGlzIG9rCgptaW51c1sxOjIsXQpwbHVzWzE6MixdCgoKCmBgYAoKVGhlIGV4cGVjdGFuY3kgcmF0aW5nIGRhdGFzZXRzIGxvb2sgbGlrZSB0aGV5IGFyZSBmb3JtYXR0ZWQgZmluZSBhbmQgbnRyaWFscyBhbmQgbnN1YiB2YXJpYWJsZXMgc2hvdWxkIGV4aXN0LiAKCiMjIyMjIENyZWF0ZSBzY3JlYW0gZGF0YQoKTmVlZCB0byBnbyBiYWNrIHRvIHN0YWdlIHplcm8gYW5kIGtlZXAgc2NyZWFtIHllcy9ubyBhcyBhIHZhcmlhYmxlLiBGb3Igbm93IHRvIHNlZSBpZiB0aGlzIHJ1bnMgY3JlYXRlIHNpbXVsYXRlZCB2ZXJzaW9uIGZvciB0aGUgQ1MrLiBDUy0gd2lsbCByZW1haW4gdGhlIHNhbWUuCgpgYGB7cn0KCnNjcmVhbU1pbnVzIDwtIG1hdHJpeCgwTCxucm93PW5zdWIsIG5jb2w9bnRyaWFscykKCiMgSW5pdGlhbGlzZSBwbHVzIGRhdGFzZXQgaW4gdGhlIHNhbWUgd2F5LCBidXQgbWFrZSB0aGUgZmlyc3QgdHJpYWwgMSBmb3IgZXZlcnlvbmUsIHRoZW4gYWRkIDggYWRkaXRpb25hbCByYW5kb20gMSdzIHBlciBwZXJzb24uIERvIHRoaXMgaW4gZm91ciByYW5kb20gcGF0dGVybnMgdG8gbWltaWMgdGhlIHJlYWwgZGF0YQoKc2MxIDwtIGMoMSwxLDAsMSwwLDAsMSwxLDEsMSwxKQpzYzIgPC0gYygwLDEsMSwxLDAsMCwxLDEsMSwxLDEpCnNjMyA8LSBjKDEsMSwxLDAsMSwwLDEsMCwxLDEsMSkKc2M0IDwtIGMoMSwwLDEsMSwwLDAsMSwxLDEsMSwxKQoKCnNjcmVhbVBsdXMgPC0gbWF0cml4KDBMLG5yb3c9bnN1YiwgbmNvbD1udHJpYWxzKQoKc2NyZWFtUGx1c1ssMV0gPC0gMQoKCiMgZm9yIChuIGluIDE6ZGltKHNjcmVhbVBsdXMpWzFdKSB7CiMgICBwcmludChuKQojICAgc2NyZWFtUGx1c1tuLDI6MTJdIDwtIHNhbXBsZShwYXR0cywxLHJlcGxhY2U9VCkKIyB9CgoKZm9yIChuIGluIDE6ZGltKHNjcmVhbVBsdXMpWzFdKSB7CiAgCiAgYSA8LSBzYW1wbGUoYygxLDQpLDEpCiAgCiAgaWYgKGEgPT0gMSkgewogICAgc2NyZWFtUGx1c1tuLDI6MTJdIDwtIHNjMQogIH0gZWxzZSBpZiAoYSA9PSAyKSB7CiAgICBzY3JlYW1QbHVzW24sMjoxMl0gPC0gc2MyCiAgfSBlbHNlIGlmIChhID09IDMpewogICAgc2NyZWFtUGx1c1tuLDI6MTJdIDwtIHNjMwogIH0gZWxzZSB7CiAgICBzY3JlYW1QbHVzW24sMjoxMl0gPC0gc2M0CiAgfQp9CgpgYGAKCgojIyMjIyBtYWtlIHJhdGluZyBkYXRhIGJpbmFyeQoKCmZvciBub3cgdG8gc2VlIGlmIHN0YW4gcnVucyB1c2luZyBiZXJub3VsbGktbG9naXQgZnVuY3Rpb24gbWFrZSBiaW5hcnkgcmVzcG9zbmVzIGZyb20gZXhwZWN0YW5jeSBpLmUuID49NC41ID09MSwgPD0gNC41ID09MC4gCgoKCmBgYHtyfQoKYmluYXJpc2UgPC0gZnVuY3Rpb24oeCkgewogIGlmZWxzZSh4ID49IDQuNSwxLDApCn0KCmBgYAoKYGBge3J9CgoKbWludXNiIDwtIGRhdGEuZnJhbWUoYXBwbHkobWludXMsMixmdW5jdGlvbih4KSBiaW5hcmlzZSh4KSkpCgpwbHVzYiA8LSBkYXRhLmZyYW1lKGFwcGx5KHBsdXMsMixmdW5jdGlvbih4KSBiaW5hcmlzZSh4KSkpCgpgYGAKCgoKIyMjIyBTZXQgdXAgcHJvY2VkdXJlIHRvIGNyZWF0ZSBhbmQgc3luYyBtb2RlbHMuCgpUaGlzIGRpcmVjdHMgdG8gbXkgbG9jYWwgbWFjaGluZSBoZXJlICoqKi9Vc2Vycy9raXJzdGluL0Ryb3Bib3gvU0dEUC9GTEFSZS9GTEFSZV9NQVNURVIvUHJvamVjdHMvSGllcmFjaGFsX21vZGVsbGluZy9TY3JpcHRzKioqIGFuZCBpcyByZW1vdGVseSBsaW5rZWQgdG8gdGhlIGdpdGh1YiBbcmVwb3NpdG9yeSBoZXJlXShodHRwczovL2dpdGh1Yi5jb20va2xwdXJ2ZXMvRkxBUmVfQmF5ZXNpYW5faGllcmFyY2hpY2FsKS4gIAoKIyMjIyMgTWFrZSBzdXJlIHRoZSBtb3N0IHVwIHRvIGRhdGUgc3RhbiBmaWxlIGlzIGluIHRoZSByZW1vdGUgcmVwbwoKCmBgYHtiYXNofQoKZ2l0IHB1bGwgQmF5ZXNfbW9kZWxsaW5nCiAgIApgYGAKCiMjIyMjIGNoZWNrIGV4aXN0aW5nIHBhcmFtdGVycwoKVW5oYXNoIHRoaXMgaWYgeW91IHdhbnQgdG8gY2hlY2sgd2hhdCB0aGUgbW9kZWwgbG9va3MgbGlrZSB3aXRoaW4gdGhlIG5vdGVib29rLgoKYGBge2Jhc2h9CnN0YW5uYW1lPSJwdW5pc2hfb25seS5zdGFuIgpzY3JpcHRkaXI9Ii9Vc2Vycy9raXJzdGluL0Ryb3Bib3gvU0dEUC9GTEFSZS9GTEFSZV9NQVNURVIvUHJvamVjdHMvSGllcmFjaGFsX21vZGVsbGluZy9TY3JpcHRzIgoKI2NhdCAkc2NyaXB0ZGlyLyRzdGFubmFtZQoKYGBgCgoKIyMjIyMgTWFrZSBhbnkgY2hhbmdlcwoKdXNlIGVjaG8gdG8gcHVzaCB0aGVzZSB0byB0aGUgbmV3IGZpbGUgaWYgeW91IHdhbnQgdG8gbWFrZSBjaGFuZ2VzIGZyb20gaGVyZS4gCgpgYGB7YmFzaH0gCgojIyBpbml0aWFsaXNlIGJhc2ggZGlyZWN0b3J5IGFuZCBmaWxlbmFtZQoKc3Rhbm5hbWU9InB1bmlzaF9vbmx5LnN0YW4iCnNjcmlwdGRpcj0iL1VzZXJzL2tpcnN0aW4vRHJvcGJveC9TR0RQL0ZMQVJlL0ZMQVJlX01BU1RFUi9Qcm9qZWN0cy9IaWVyYWNoYWxfbW9kZWxsaW5nL1NjcmlwdHMiCgoKI2VjaG8gIjxhbnkgY2hhbmdlcyBoZXJlPiIgPiAkc2NyaXB0ZGlyLyRzdGFubmFtZQoKYGBgCgoKIyMjIyBOb3cgdHJ5IHJ1biBzdGFuCgp1bmhhc2ggdGhpcyB0byBydW4gZXhwZXJpbWVudGFsIHNjcmlwdCB0aGF0IGNoZWNrZWQgaWYgc3RhbiBydW5zLiBUaGlzIHdhcyBtb3N0bHkgdG8gY2hlY2sgZGF0YSBmb3JtYXR0aW5nIGFuZCBpbnN0YWxsYXRpb24gLyBjb21waWxhdGlvbiBldGMuCgoKYGBge3J9CgpmbGFyZV9kYXRhPC1saXN0KG50cmlhbHM9bnRyaWFscyxuc3ViPW5zdWIsaW5jbHVkZVRyaWFsID0gcmVwKDEsbnRyaWFscyksIHNjcmVhbVBsdXM9dChzY3JlYW1QbHVzKSxzY3JlYW1NaW51cz10KHNjcmVhbU1pbnVzKSwKICAgICAgICAgICAgICAgICByYXRpbmdQbHVzPXQocGx1c2IpLHJhdGluZ01pbnVzPXQobWludXNiKSkKCiNmbGFyZV9maXQgPC0gc3RhbihmaWxlID0gc3RhbmZpbGUsIGRhdGEgPSBmbGFyZV9kYXRhLCBpdGVyPWNoYWluX2l0ZXIsIGNoYWlucyA9IGNoYWluX24pICNhZGQgd29ya2luZyBkaXI/Cgojc2F2ZShmbGFyZV9maXQsIGZpbGU9ZmlsZS5wYXRoKGRhdGFkaXIsJ2ZsYXJlX2ZpdF90ZXN0JykpCgojdHJhY2VwbG90KGZsYXJlX2ZpdCwnbHBfXycpCgojIGV4dHJhY3QgZml0IGRhdGEKI3N1bW1hcnlfZmxhcmU8LSBzdW1tYXJ5KGZsYXJlX2ZpdCkKCiMgZXh0cmFjdCBtb2RlbCBzdW1tYXJ5IGRhdGEKCiNmbGFyZV9sb2dsaWtlPC0gZXh0cmFjdF9sb2dfbGlrKGZsYXJlX2ZpdCwgcGFyYW1ldGVyX25hbWUgPSAibG9nbGlrIiwgbWVyZ2VfY2hhaW5zID0gVFJVRSkKCgoKYGBgCgp2aWV3IHRoZSBmaXQgaW5mb3JtYXRpb24KCmBgYHtyfQoKI3N1bW1hcnlfZmxhcmUKCmBgYApleHRyYWN0IHRoZSBsb2dsaWtlbGlob29kIHVzaW5nIGxvbwoKYGBge3J9CgojbG9vKGZsYXJlX2xvZ2xpa2UpCgpgYGAKCnNvLCBnb29kIG5ld3MgaXMgdGhpcyBhbGwgd29ya3MuIFNvIHByZWxpbWluYXJ5IGNoZWNrIGEgc3VjY2Vzcy4gTmV4dCBuZWVkIHRvIGNvbnNpZGVyIHRoZSBhcHByb3ByaWF0ZSBtb2RlbC4gCgoKIyMgQ3JlYXRlIHN0YW4gZnJpZW5kbHkgZGF0YXNldHMKCiMjIyBub3RlcwoKV2UgbmVlZCB0byByZXNjYWxlIG91ciBkYXRhc2V0IGhlcmUgdG8gYmUgYmV0d2VlbiAwIGFuZCAxLiAKCkltcG9ydGFudGx5LCBiZWNhdXNlIHdlIGFyZSB1c2luZyB0aGUgcHJvcG9ydGlvbiBvZiB0cmlhbHMgdGhhdCAqKmFyZSBub3QqKiByZWluZm9yY2VkIGFzIGEga25vd24gcGFyYW10ZXIgZm9yIHN0YXRpc3RpY2FsIHJlYXNvbnMgKHdlIGRvbid0IHdhbnQgYSBwcm9wb3J0aW9uIG9mIC43NSBhbmQgMSwgYmV0dGVyIHRvIGhhdmUgLjI1IGFuZCAwKSwgd2UgaGF2ZSBtYWRlIG91ciByZXNjYWxlZCBleHBlY3RhbmN5IHZhbHVlcyBhcyAxIC0gcmVzY2FsZWQoeCkuIFRoaXMgbWVhbnMgdGhhdCB3ZSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gaW50ZXJwcmV0IHRoZSByZXN1bHRzIGluIHRoZSBleHBlY3RlZCB3YXkgKGkuZS4gaGlnaGVyIHJhdGluZyBpcyBncmVhdGVyIGV4cGVjdGF0aW9uIG9mIHRoZSBvdXRjb21lKS4KCgojIyMgcmVzY2FsZSBkYXRhCgpyZXNjYWxlIHRoZSAxLTkgZXhwZWN0YW5jeSB2YWx1ZXMgdG8gYmUgb24gYSAwLTEgc2NhbGUuCgpzdGFuIGNhbm5vdCBkZWFsIHdpdGggdGhlIGV4dHJlbWUgbGltaXQgb2YgdGhlIGJldGEsIHNvIG1ha2UgdGhlIHJlc2NhbGVkIGxpbWl0cyBqdXN0IGFib3ZlIDAgYW5kIGJlbG93IG9uZQoKTm90ZSB0aGF0IHdoZW4gYSB2YWx1ZSBoYWQgdG8gYmUgaW1wdXRlZCBhcyBpdCB3YXMgbWlzc2luZyBpdCB3aWxsIG5vdCBiZSBhbiBpbnRlZ2VyLiBUaHVzIHRoZSBmdW5jdGlvbiBuZWVkcyB0byBhbGxvdyBmb3IgcmFuZ2VzIGJldHdlZW4gdmFsdWVzLgoKYGBge3J9CgpsaWJyYXJ5KHNjYWxlcykKCiMgcmVzY2FsZSBhbmQgZmxpcCBzbyB0aGF0IHdlIGFyZSBlZmZlY3RpdmVseSByYXRpbmcgdGhlIGV4cGVjdGF0aW9uIHRoYXQgdGhleSBXSUxMIE5PVCBoZWFyIGEgc2NyZWFtIHRvIG1hdGNoIHN0YW4KCiMjIHJlc2NhbGluZyBzdWNoIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBzcGFjZXMgdGhlIG51bWJlcnMgMS05IGV2ZW5seS4gdGhlIGZpcnN0IGludGVydmFsIHVwcGVyIGJvdW5kIHdvdWxkIGJlIDAuMTEsIHRoZW4gMC4yMiBldGMuIHRoaXMgbWVhbnMgdGhhdCB0aGUgbWlkIHBvaW50IG9mIGVhY2ggaXRuZXJ2YWwgd2lsbCBiZToKCnByaW50KCJtaWQgcG9pbnQgb2YgZWFjaCBldmVubHkgc3BhY2VkIGludGVydmFsIHJlcHJlc2VudGluZyB2YWx1ZXMgYmV0d2VlbiAxLTkiKQpzZXEoMC41LzksMSwxLzkpCgoKIyMgdGh1cyAxIHdpbGwgYmUgMS0wLjA1NSBldGMuCgojIyBOT1RFOiBtaWdodCB3YW50IHRvIGNvbnNpZGVyIG1ha2luZyB0aGlzIG1vcmUgZmxleGlibGUuIGVudGVyIGluIHRoZSBudW1lciBvZiBjaG9pY2Ugb3B0aW9ucyBhcyBhIHZhcmlhYmxlIC0gd291bGQgYmUgdmVyeSBlYXN5LiBhZGQgdG8gZnVuY3Rpb24gbGlicmFyeSBhdCBsYXRlciBzdGFnZQoKc2NhbGVfZmxhcmUgPC0gZnVuY3Rpb24oeCl7CiAgCiAgdmFscyA8LSBzZXEoMC41LzksMSwxLzkpCiAgCiAgZm9yICh2YWwgaW4gMTo5KXsKICAgIGlmICh4ID4gdmFsLTEgJiB4IDw9IHZhbCl7CiAgICAgIHggPC0gMSAtIHZhbHNbdmFsXQogICAgfQogIH0KICByZXR1cm4oeCkKfQoKCiMjIGluaXRpYWxpc2UgbWludXNfc2NhbGVkIGRhdGFmcmFtZS4KCm1pbnVzX3NjYWxlZCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPWRpbShtaW51cylbMl0sbnJvdyA9IGRpbShtaW51cylbMV0pKQoKIyMgIHBvcHVsYXRlIHdpdGggcmV4Y2FsZWQgdmFsdWVzCgpmb3IgKHN1YiBpbiAxOmRpbShtaW51cylbMV0pewogIGZvciAoY29sIGluIDE6ZGltKG1pbnVzKVsyXSl7CiAgICAKICAgIG1pbnVzX3NjYWxlZFtzdWIsY29sXSA8LSBzY2FsZV9mbGFyZShtaW51c1tzdWIsY29sXSkKICB9Cn0KCiMjIGRpdHRvIGZvciBwbHVzCgpwbHVzX3NjYWxlZCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPWRpbShtaW51cylbMl0sbnJvdyA9IGRpbShtaW51cylbMV0pKQoKZm9yIChzdWIgaW4gMTpkaW0ocGx1cylbMV0pewogIGZvciAoY29sIGluIDE6ZGltKHBsdXMpWzJdKXsKICAgIAogICAgcGx1c19zY2FsZWRbc3ViLGNvbF0gPC0gc2NhbGVfZmxhcmUocGx1c1tzdWIsY29sXSkKICB9Cn0KCgoKIyMgdGhpcyBpcyB0aGUgbnVtYmVyIHRoYXQgd2lsbCB0YWtlIGZyb20gdGhlIG1pZHBvaW50IHRvIHRoZSB0b3AgYW5kIGJvdHRvbSBmb3IgdGhlIG5ldyBib3VuZGFyaWVzICh3aXRoIHJhdGluZ3MgcmVwcmVzZW50aW5nIHRoZSBtaWRwb2ludCkKCmNkZl9zY2FsZSA8LSAxLzE4CgoKCgpgYGAKCiMjIyBjcmVhdGUgcHJvcG9ydGlvbiBzY3JlYW1zIGRhdGEKClRoaXMgaXMgYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgYWJzb2x1dGUgbnVtYmVyIG9mIHRyaWFscyB3aGVyZSBubyBzY3JlYW0gb2NjdXJyZWQgZm9yIGVhY2ggc3RpbXVsdXMuIEFzIHRoZXJlIHdhcyBhIDc1JSByZWluZm9yY2VtZW50IHJhdGUgZm9yIHRoZSBDUysgKDkvMTIgdHJpYWxzKSwgdGhpcyBpcyBhIHZlY3RvciBvZiAnMydzLiBGb3IgdGhlIENTLSwgbm8gdHJpYWxzIHdlcmUgcmVpbmZvcmNlZCBzbyBpcyBhIHZlY3RvciBvZiAnMTIncwoKYGBge3J9CgpOb19zY3JlYW1fcCA8LSByZXAoMyxuc3ViKQpOb19zY3JlYW1fbSA8LSByZXAoMTIsbnN1YikKCmBgYAoKIyMjIyBDcmVhdGUgc2NyZWFtIGRhdGEKCkNyZWF0ZSBkYXRhc2V0cyBmb3IgdGhlIGFjcXVpc2l0aW9uIENTLSBhbmQgZXh0aW5jdGlvbiBDUysgYW5kIENTLSByZWZsZWN0aW5nIHRoYXQgbm8gc2NyZWFtcyBvY2N1cnJlZCBhdCBhbGwuIFRoZW4gdXNlIHRoZSBwYXR0ZXJuIGlkIHZhcmlhYmxlIHRvIGNyZWF0ZSBhIGRhdGFzZXQgZm9yIHRoZSBhY3F1aXNpdGlvbiBDUysgaW5kaWNhdGluZyB3aGVuIGEgc2NyZWFtIG9jY3VycmVkIGZvciBlYWNoIHBhcnRpY2lwYW50LgoKYGBge3J9CgojIyBDcmVhdGUgdGhlIG5vIHNjcmVhbSBkYWF0c2V0cyBmb3IgYWxsCgpzY3JlYW1NaW51cyA8LSBtYXRyaXgoMEwsbnJvdz1uc3ViLCBuY29sPW50cmlhbHMpCgojIEluaXRpYWxpc2UgcGx1cyBkYXRhc2V0IGluIHRoZSBzYW1lIHdheSwgYnV0IG1ha2UgdGhlIGZpcnN0IHRyaWFsIDEgZm9yIGV2ZXJ5b25lLCB0aGVuIGFkZCA4IGFkZGl0aW9uYWwgcmFuZG9tIDEncyBwZXIgcGVyc29uLiBEbyB0aGlzIGluIGZvdXIgcmFuZG9tIHBhdHRlcm5zIHRvIG1pbWljIHRoZSByZWFsIGRhdGEKCnNjMSA8LSBjKDEsMSwwLDEsMCwwLDEsMSwxLDEsMSkKc2MyIDwtIGMoMCwxLDEsMSwwLDAsMSwxLDEsMSwxKQpzYzMgPC0gYygxLDEsMSwwLDEsMCwxLDAsMSwxLDEpCnNjNCA8LSBjKDEsMCwxLDEsMCwwLDEsMSwxLDEsMSkKCgpzY3JlYW1QbHVzIDwtIG1hdHJpeCgwTCxucm93PW5zdWIsIG5jb2w9bnRyaWFscykKCnNjcmVhbVBsdXNbLDFdIDwtIDEKCgojIGZvciAobiBpbiAxOmRpbShzY3JlYW1QbHVzKVsxXSkgewojICAgcHJpbnQobikKIyAgIHNjcmVhbVBsdXNbbiwyOjEyXSA8LSBzYW1wbGUocGF0dHMsMSxyZXBsYWNlPVQpCiMgfQoKCmZvciAobiBpbiAxOmRpbShzY3JlYW1QbHVzKVsxXSkgewogIAogIGEgPC0gc2FtcGxlKGMoMSw0KSwxKQogIAogIGlmIChhID09IDEpIHsKICAgIHNjcmVhbVBsdXNbbiwyOjEyXSA8LSBzYzEKICB9IGVsc2UgaWYgKGEgPT0gMikgewogICAgc2NyZWFtUGx1c1tuLDI6MTJdIDwtIHNjMgogIH0gZWxzZSBpZiAoYSA9PSAzKXsKICAgIHNjcmVhbVBsdXNbbiwyOjEyXSA8LSBzYzMKICB9IGVsc2UgewogICAgc2NyZWFtUGx1c1tuLDI6MTJdIDwtIHNjNAogIH0KfQoKYGBgCgojIyBDcmVhdGUgZGF0YXNldCBmb3IgYmFycGxvdCBjb21wYXJpbmcgb3V0cHV0CgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKbW9kX2NvbXAgPC0gZGF0YS5mcmFtZShtb2RlbD1OQSxCSUM9TkEpCgpgYGAKCiMgQmFzZWxpbmUgbW9kZWxzCgojIyBNb2RlbCAxOiBzaW5nbGUgYmV0YSBubyBzY2FsaW5nIHsudGFic2V0fQoKIyMjIG5vdGVzCgpCZWNhdXNlIHdlIHVzZSB0aGUgMS1yZXNjYWxlZCBleHBlY3RhbmN5IGRhdGEsIG5vIG5lZWQgdG8gdHJ5IGFuZCBpbnZlcnQgdG8gcmVpbmZvcmNlbWVudCBwYXJhbXRlcnMgaGVyZS4gQXMgYSByZXN1bHQgd2UgbmVlZCB0aGUgc3RhbiBtb2RlbCB0byBzaW1wbHkgYmU6ICAgCgpgYGAKYWxwaGFQbHVzW3BdID0gIG5vdGhpbmdQbHVzW3BdL250cmlhbHM7CmFscGhhTWludXNbcF0gPSAgbm90aGluZ01pbnVzW3BdL250cmlhbHM7CmBgYAoKIyMjIHJ1biBBbGV4IFBpa2UncyBzdGFuIHNjcmlwdCBmb3Igbm9uIHNjYWxlZCBiZXRhIG1vZGVsLgoKaGVyZSB3ZSB0cnkgdG8gZXN0aW1hdGUgdGhlIGFscGhhIHBhcmFtdGVyIG9mIHRoZSBiZXRhIGRpc3RyaWJ1dGlvbiBwZXIgdHJpYWwgcGVyIHBlcnNvbiBwZXIgc3RpbXVsdXMuIChpLmUuIHlvdSBoYXZlIHR3byBzdWZmaWNpZW50IHBhcmFtdGVycyBmb3IgZWFjaCBiZXRhIGRpc3QsIHRoZSBhbHBoYSBhbmQgYmV0YS4gd2Ugd2FudCB0byBlc3RpbWF0ZSB0aGUgYWxwaGEgLSApLiAKCkV2ZW50dWFsbHkgd2Ugd2lsbCBzY2FsZSB0aGVzZSBieSB0aGUgYWN0dWFsICd2YWx1ZScgb2YgdGhlIHNjcmVhbSBmb3IgZWFjaCBwZXJzb24gcGVyIHRyaWFsLiAKClVzaW5nIGRhdGEgbG9hZGVkIGluIGZyb20gcHJlbGltaW5hcnkgdGVzdHMgYWJvdmUuCgpzbyB0aGlzIGlzIGEgYmV0YSB2YWx1ZSBwZXIgcGVyc29uIChhc3N1bWluZyB0aGUgdW5kZXJseWluZyBwcm9jZXNzIGZvciB0aGUgcGx1cyBhbmQgbWludXMgYXJlIHRoZSBzYW1lKQoKYGBge3J9CiMjIGRlY2lkZSB0ZXN0aW5nIHJhdGUgKG1pbixtZWQsbWF4IG9yIG9mZikKdGVzdGluZygnbWluJykKCiMjIHNldCB1cCBydW4Kc3Rhbm5hbWU9J2JldGFfbm9zY2FsaW5nLnN0YW4nCgpzdGFuZmlsZSA8LSBmaWxlLnBhdGgoc2NyaXB0ZGlyLCBzdGFubmFtZSkKCmZsYXJlX2RhdGE8LWxpc3QobnRyaWFscz1udHJpYWxzLG5zdWI9bnN1Yixub3RoaW5nUGx1cyA9IE5vX3NjcmVhbV9wLCBub3RoaW5nTWludXM9Tm9fc2NyZWFtX20scmF0aW5nc1BsdXM9cGx1c19zY2FsZWQscmF0aW5nc01pbnVzPW1pbnVzX3NjYWxlZCkKCmZsYXJlX2ZpdCA8LSBzdGFuKGZpbGUgPSBzdGFuZmlsZSwgZGF0YSA9IGZsYXJlX2RhdGEsIGl0ZXI9Y2hhaW5faXRlciwgY2hhaW5zID0gY2hhaW5fbikgI2FkZCB3b3JraW5nIGRpcj8KCnNhdmUoZmxhcmVfZml0LCBmaWxlPWZpbGUucGF0aChkYXRhZGlyLCdmbGFyZV9maXRfdGVzdCcpKQoKdHJhY2VwbG90KGZsYXJlX2ZpdCwnbHBfXycpCgojIGV4dHJhY3QgZml0IGRhdGEKc3VtbWFyeV9mbGFyZTwtIHN1bW1hcnkoZmxhcmVfZml0KQoKIyBleHRyYWN0IG1vZGVsIHN1bW1hcnkgZGF0YQoKI2ZsYXJlX2xvZ2xpa2U8LSBleHRyYWN0X2xvZ19saWsoZmxhcmVfZml0LCBwYXJhbWV0ZXJfbmFtZSA9ICJsb2dsaWsiLCBtZXJnZV9jaGFpbnMgPSBUUlVFKQoKYGBgCgpgYGB7cn0KIyMgZ2V0IHNvbWUgYmFzaWMgb3V0cHV0IGRlc2NyaXB0aW9ucyBwcmludGVkIHRvIHNjcmVlbgoKb3V0X2Rlc2NyaWJlKHN1bW1hcnlfZmxhcmUpCgpgYGAKCiMjIE1vZGVsIDI6IHNpbmdsZSBiZXRhIHNjYWxlZCB7LnRhYnNldH0KCiMjIyBub3RlcwoKU2ltcGxlIGFsdGVyYXRpb24gb2YgdGhlIGZpcnN0IG1vZGVsLiBXZSBlc3RpbWF0ZSBhIHNjYWxpbmcgcGFyYW1ldGVyIHBlciBwZXJzb24gb3ZlciBhbGwgdHJpYWxzIGFuZCBhcHBseSB0aGlzIHRvIGFscGhhIGNvbXBvbmVudCBwZXIgcGFydGljaXBhbnQuCgojIyMgcnVuIEFsZXggUGlrZSdzIHN0YW4gc2NyaXB0IGZvciBzY2FsZWQgYmV0YSBtb2RlbC4KCmhlcmUgd2UgdHJ5IHRvIGVzdGltYXRlIHRoZSBhbHBoYSBwYXJhbXRlciBvZiB0aGUgYmV0YSBkaXN0cmlidXRpb24gcGVyIHRyaWFsIHBlciBwZXJzb24gcGVyIHN0aW11bHVzLiAoaS5lLiB5b3UgaGF2ZSB0d28gc3VmZmljaWVudCBwYXJhbXRlcnMgZm9yIGVhY2ggYmV0YSBkaXN0LCB0aGUgYWxwaGEgYW5kIGJldGEuIHdlIHdhbnQgdG8gZXN0aW1hdGUgdGhlIGFscGhhIC0gKS4gCgpFdmVudHVhbGx5IHdlIHdpbGwgc2NhbGUgdGhlc2UgYnkgdGhlIGFjdHVhbCAndmFsdWUnIG9mIHRoZSBzY3JlYW0gZm9yIGVhY2ggcGVyc29uIHBlciB0cmlhbC4gCgpVc2luZyBkYXRhIGxvYWRlZCBpbiBmcm9tIHByZWxpbWluYXJ5IHRlc3RzIGFib3ZlLgoKc28gdGhpcyBpcyBhIGJldGEgdmFsdWUgcGVyIHBlcnNvbiAoYXNzdW1pbmcgdGhlIHVuZGVybHlpbmcgcHJvY2VzcyBmb3IgdGhlIHBsdXMgYW5kIG1pbnVzIGFyZSB0aGUgc2FtZSkKCmBgYHtyfQojIyBkZWNpZGUgdGVzdGluZyByYXRlIChtaW4sbWVkLG1heCBvciBvZmYpCnRlc3RpbmcoJ21pbicpCgojIyBzZXQgdXAgcnVuCnN0YW5uYW1lPSdiZXRhX3NjYWxpbmcuc3RhbicKCnN0YW5maWxlIDwtIGZpbGUucGF0aChzY3JpcHRkaXIsIHN0YW5uYW1lKQoKZmxhcmVfZGF0YTwtbGlzdChudHJpYWxzPW50cmlhbHMsbnN1Yj1uc3ViLG5vdGhpbmdQbHVzID0gTm9fc2NyZWFtX3AsIG5vdGhpbmdNaW51cz1Ob19zY3JlYW1fbSxyYXRpbmdzUGx1cz1wbHVzX3NjYWxlZCxyYXRpbmdzTWludXM9bWludXNfc2NhbGVkKQoKZmxhcmVfZml0IDwtIHN0YW4oZmlsZSA9IHN0YW5maWxlLCBkYXRhID0gZmxhcmVfZGF0YSwgaXRlcj1jaGFpbl9pdGVyLCBjaGFpbnMgPSBjaGFpbl9uKSAjYWRkIHdvcmtpbmcgZGlyPwoKc2F2ZShmbGFyZV9maXQsIGZpbGU9ZmlsZS5wYXRoKGRhdGFkaXIsJ2ZsYXJlX2ZpdF90ZXN0JykpCgp0cmFjZXBsb3QoZmxhcmVfZml0LCdscF9fJykKCiMgZXh0cmFjdCBmaXQgZGF0YQpzdW1tYXJ5X2ZsYXJlPC0gc3VtbWFyeShmbGFyZV9maXQpCgojIGV4dHJhY3QgbW9kZWwgc3VtbWFyeSBkYXRhCgojZmxhcmVfbG9nbGlrZTwtIGV4dHJhY3RfbG9nX2xpayhmbGFyZV9maXQsIHBhcmFtZXRlcl9uYW1lID0gImxvZ2xpayIsIG1lcmdlX2NoYWlucyA9IFRSVUUpCgpgYGAKCmBgYHtyfQojIyBnZXQgc29tZSBiYXNpYyBvdXRwdXQgZGVzY3JpcHRpb25zIHByaW50ZWQgdG8gc2NyZWVuCgpvdXRfZGVzY3JpYmUoc3VtbWFyeV9mbGFyZSkKCmBgYAoKIyMjIHJ1biBBbGV4IFBpa2UncyBzdGFuIHNjcmlwdCBmb3Igc2NhbGVkIGJldGEgbW9kZWwuCgpoZXJlIHdlIHRyeSB0byBlc3RpbWF0ZSB0aGUgYWxwaGEgcGFyYW10ZXIgb2YgdGhlIGJldGEgZGlzdHJpYnV0aW9uIHBlciB0cmlhbCBwZXIgcGVyc29uIHBlciBzdGltdWx1cy4gKGkuZS4geW91IGhhdmUgdHdvIHN1ZmZpY2llbnQgcGFyYW10ZXJzIGZvciBlYWNoIGJldGEgZGlzdCwgdGhlIGFscGhhIGFuZCBiZXRhLiB3ZSB3YW50IHRvIGVzdGltYXRlIHRoZSBhbHBoYSAtICkuIAoKRXZlbnR1YWxseSB3ZSB3aWxsIHNjYWxlIHRoZXNlIGJ5IHRoZSBhY3R1YWwgJ3ZhbHVlJyBvZiB0aGUgc2NyZWFtIGZvciBlYWNoIHBlcnNvbiBwZXIgdHJpYWwuIAoKVXNpbmcgZGF0YSBsb2FkZWQgaW4gZnJvbSBwcmVsaW1pbmFyeSB0ZXN0cyBhYm92ZS4KCnNvIHRoaXMgaXMgYSBiZXRhIHZhbHVlIHBlciBwZXJzb24gKGFzc3VtaW5nIHRoZSB1bmRlcmx5aW5nIHByb2Nlc3MgZm9yIHRoZSBwbHVzIGFuZCBtaW51cyBhcmUgdGhlIHNhbWUpCgpgYGB7cn0KIyMgZGVjaWRlIHRlc3RpbmcgcmF0ZSAobWluLG1lZCxtYXggb3Igb2ZmKQp0ZXN0aW5nKCdtaW4nKQoKIyMgc2V0IHVwIHJ1bgpzdGFubmFtZT0nYmV0YV93aXRoUkwuc3RhbicKCnN0YW5maWxlIDwtIGZpbGUucGF0aChzY3JpcHRkaXIsIHN0YW5uYW1lKQoKZmxhcmVfZGF0YTwtbGlzdChudHJpYWxzPW50cmlhbHMsbnN1Yj1uc3ViLHNjcmVhbVBsdXMgPSB0KHNjcmVhbVBsdXMpLCBzY3JlYW1NaW51cz0gdChzY3JlYW1NaW51cykscmF0aW5nc1BsdXM9dChwbHVzX3NjYWxlZCkscmF0aW5nc01pbnVzPXQobWludXNfc2NhbGVkKSkKCmZsYXJlX2ZpdCA8LSBzdGFuKGZpbGUgPSBzdGFuZmlsZSwgZGF0YSA9IGZsYXJlX2RhdGEsIGl0ZXI9Y2hhaW5faXRlciwgY2hhaW5zID0gY2hhaW5fbikgI2FkZCB3b3JraW5nIGRpcj8KCnNhdmUoZmxhcmVfZml0LCBmaWxlPWZpbGUucGF0aChkYXRhZGlyLCdmbGFyZV9maXRfdGVzdCcpKQoKdHJhY2VwbG90KGZsYXJlX2ZpdCwnbHBfXycpCgojIGV4dHJhY3QgZml0IGRhdGEKc3VtbWFyeV9mbGFyZSA8LSBzdW1tYXJ5KGZsYXJlX2ZpdCkKCiMgZXh0cmFjdCBtb2RlbCBzdW1tYXJ5IGRhdGEKCiNmbGFyZV9sb2dsaWtlPC0gZXh0cmFjdF9sb2dfbGlrKGZsYXJlX2ZpdCwgcGFyYW1ldGVyX25hbWUgPSAibG9nbGlrIiwgbWVyZ2VfY2hhaW5zID0gVFJVRSkKCmBgYAoKYGBge3J9CiMjIGdldCBzb21lIGJhc2ljIG91dHB1dCBkZXNjcmlwdGlvbnMgcHJpbnRlZCB0byBzY3JlZW4KCm91dF9kZXNjcmliZShzdW1tYXJ5X2ZsYXJlKQoKYGBgCgoKIyMgTW9kZWwgMzogUkwsIG1lYW4gZGVmaW5lZCwgc2luZ2xlIGJldGEgey50YWJzZXR9CgojIyMgbm90ZXMKCnRoaXMgbW9kZWwgaW5jbHVkZXMgYW4gYWxwaGEgbGVhcm5pbmcgcGFyYW1hdGVyIHBlciBwZXJzb24gZXN0aW1hdGluZyB0aGVpciBsZWFybmluZyByYXRlIGFuZCB1cGRhdGluZyBiYXNlZCBvbiBpdC4gVGhpcyBtb2RlbCBuZWVkcyBhIGRhdGFzZXQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBhIHNjcmVhbSBvY2N1cnJlZCBmb3IgZWFjaCB0cmlhbCBpbnN0ZWFkIG9mIHRoZSBwcm9wb3J0aW9uIG9mIHRpbWVzIG5vIHNjcmVhbSBvY2N1cnJlZC4KCgojIyMgTWVhbiB0byBkZWZpbmUgc2hhcGUKCnRoaXMgbW9kZWwgaW5jbHVkZXMgYW4gYWxwaGEgbGVhcm5pbmcgcGFyYW1hdGVyIHBlciBwZXJzb24gZXN0aW1hdGluZyB0aGVpciBsZWFybmluZyByYXRlIGFuZCB1cGRhdGluZyBiYXNlZCBvbiBpdC4gVGhpcyBtb2RlbCBuZWVkcyBhIGRhdGFzZXQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBhIHNjcmVhbSBvY2N1cnJlZCBmb3IgZWFjaCB0cmlhbCBpbnN0ZWFkIG9mIHRoZSBwcm9wb3J0aW9uIG9mIHRpbWVzIG5vIHNjcmVhbSBvY2N1cnJlZC4KCkFsZXggdXNlZCB0aGlzIFtzdGFjayBwb3N0XShodHRwczovL3N0YXRzLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xMjIzMi9jYWxjdWxhdGluZy10aGUtcGFyYW1ldGVycy1vZi1hLWJldGEtZGlzdHJpYnV0aW9uLXVzaW5nLXRoZS1tZWFuLWFuZC12YXJpYW5jZSkgdG8gaGVscCBzb2x2ZSB0aGUgc2hhcGUgcGFyYW10ZXJzIHVzaW5nIG1lYW4gYW5kIHNkIHdoZXJlIHdlIGFzc3VtZSB0aGF0IHYgc2VydmVzIGFzIHRoZSBtZWFuIGFuZCBiZXRhIGFzIHRoZSBzZC4KCnRoZSBlcXVhdGlvbnMgd29yayBvdXQgdG8gdGhpczoKCmZvciBzaGFwZSAxOiAKCgokJFxhbHBoYSA9IFxsZWZ0KFxmcmFjezEtXG11fXtcc2lnbWFeMn0gLSBcZnJhY3sxfXtcbXV9XHJpZ2h0KVxtdV4yJCQKCmZvciBzaGFwZSAyOiAKCiQkXGJldGE9XGFscGhhIFxsZWZ0KFxmcmFjezF9e1xtdX0tMVxyaWdodCkkJAoKSGFzaGVkIHRoaXMgb3V0IGFzIGl0IGRvZXNudCBydW4hCgpgYGB7cn0KIyAjIyBkZWNpZGUgdGVzdGluZyByYXRlIChtaW4sbWVkLG1heCBvciBvZmYpCiMgdGVzdGluZygnbWluJykKIyAKIyAjIyBzZXQgdXAgcnVuCiMgc3Rhbm5hbWU9J2JldGFfbWVhbnNkX1JMLnN0YW4nCiMgCiMgc3RhbmZpbGUgPC0gZmlsZS5wYXRoKHNjcmlwdGRpciwgc3Rhbm5hbWUpCiMgCiMgZmxhcmVfZGF0YTwtbGlzdChudHJpYWxzPW50cmlhbHMsbnN1Yj1uc3ViLHNjcmVhbVBsdXMgPSB0KHNjcmVhbVBsdXMpLCBzY3JlYW1NaW51cz10KHNjcmVhbU1pbnVzKSxyYXRpbmdzUGx1cz10KHBsdXNfc2NhbGVkKSxyYXRpbmdzTWludXM9dChtaW51c19zY2FsZWQpKQojIAojIGZsYXJlX2ZpdCA8LSBzdGFuKGZpbGUgPSBzdGFuZmlsZSwgZGF0YSA9IGZsYXJlX2RhdGEsIGl0ZXI9Y2hhaW5faXRlciwgY2hhaW5zID0gY2hhaW5fbikgI2FkZCB3b3JraW5nIGRpcj8KIyAKIyBzYXZlKGZsYXJlX2ZpdCwgZmlsZT1maWxlLnBhdGgoZGF0YWRpciwnZmxhcmVfZml0X3Rlc3QnKSkKIyAKIyB0cmFjZXBsb3QoZmxhcmVfZml0LCdscF9fJykKIyAKIyAjIGV4dHJhY3QgZml0IGRhdGEKIyBzdW1tYXJ5X2ZsYXJlPC0gc3VtbWFyeShmbGFyZV9maXQpCiMgCiMgIyBleHRyYWN0IG1vZGVsIHN1bW1hcnkgZGF0YQojIAojICNmbGFyZV9sb2dsaWtlPC0gZXh0cmFjdF9sb2dfbGlrKGZsYXJlX2ZpdCwgcGFyYW1ldGVyX25hbWUgPSAibG9nbGlrIiwgbWVyZ2VfY2hhaW5zID0gVFJVRSkKCmBgYAoKYGBge3J9CiMjIGdldCBzb21lIGJhc2ljIG91dHB1dCBkZXNjcmlwdGlvbnMgcHJpbnRlZCB0byBzY3JlZW4KCiMgb3V0X2Rlc2NyaWJlKHN1bW1hcnlfZmxhcmUpCgpgYGAKCk9uIDUwMCBpdGVyYXRpb25zIChpLmUuIHRlc3QpIHRoZSB2YXJpYW5jZSBpbiBhbHBoYSBpcyBnb29kLCBidXQgdGhlIHRyYWNlcGxvdCBpcyB0ZXJyaWJsZS4gTW9kZWwgY292ZXJnZXMgdmVyeSBwb29ybHkuIFdlIGFsc28gaGF2ZSB0byBjb25zdHJhaW4gdGhlIGJldGEgdG8gYmUgYmV0d3FlZW4gMCBhbmQgMC4wMDAxLiBOb3Qgc3VyZSB3aHkgdGhpcyBpcy4gCgp3aGVuIHJ1bm5pbmcgZm9yIDIwMDAgaXRlcmF0aW9ucyAoMTAwMCB3YXJtdXApLi4uCgpUaGlzIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyB3YXJuaW5nOwoKPj4gVGhlcmUgd2VyZSAyNjQ0IGRpdmVyZ2VudCB0cmFuc2l0aW9ucyBhZnRlciB3YXJtdXAuIEluY3JlYXNpbmcgYWRhcHRfZGVsdGEgYWJvdmUgMC44IG1heSBoZWxwLiBTZWUKaHR0cDovL21jLXN0YW4ub3JnL21pc2Mvd2FybmluZ3MuaHRtbCNkaXZlcmdlbnQtdHJhbnNpdGlvbnMtYWZ0ZXItd2FybXVwVGhlcmUgd2VyZSA0IHRyYW5zaXRpb25zIGFmdGVyIHdhcm11cCB0aGF0IGV4Y2VlZGVkIHRoZSBtYXhpbXVtIHRyZWVkZXB0aC4gSW5jcmVhc2UgbWF4X3RyZWVkZXB0aCBhYm92ZSAxMC4gU2VlCmh0dHA6Ly9tYy1zdGFuLm9yZy9taXNjL3dhcm5pbmdzLmh0bWwjbWF4aW11bS10cmVlZGVwdGgtZXhjZWVkZWRUaGVyZSB3ZXJlIDQgY2hhaW5zIHdoZXJlIHRoZSBlc3RpbWF0ZWQgQmF5ZXNpYW4gRnJhY3Rpb24gb2YgTWlzc2luZyBJbmZvcm1hdGlvbiB3YXMgbG93LiBTZWUKaHR0cDovL21jLXN0YW4ub3JnL21pc2Mvd2FybmluZ3MuaHRtbCNiZm1pLWxvd0V4YW1pbmUgdGhlIHBhaXJzKCkgcGxvdCB0byBkaWFnbm9zZSBzYW1wbGluZyBwcm9ibGVtcwoKIyMjIE1lYW4gZGVmaW5pdGlvbiAyCgpUaGUgYWJvdmUgbWVhbiBkZWZpbml0aW9uIGRvZXMgbm90IG1hcCB0aGUgZGF0YSB3ZWxsICh0ZXJyaWJsZSB0cmFjZXBsb3QhKS4gSSBmb3VuZCBbdGhpcyBmcm9tIHRoZSBNUkMgQlNVXShodHRwczovL3d3dy5tcmMtYnN1LmNhbS5hYy51ay93cC1jb250ZW50L3VwbG9hZHMvYnVnc2Jvb2tfY2hhcHRlcjUucGRmKSBhbmQgaGF2ZSB0cmllZCBkZWZpbmluZyB0aGUgYmV0YSBwYXJhbWV0ZXJzIGFzc3VtaW5nIFYgPT0gbWVhbiBpbiBhIHNsaWdodHkgZGlmZmVyZW50IHdheToKCmZvciBwYXJhbWF0ZXIgYToKCiQkXGFscGhhID0gXG11XGJldGEvKDEtXG11KSQkCgpmb3IgcGFyYW1ldGVyIGI6CgokJFxiZXRhID0gXG11KDEtXG11KV4yL1xzaWdtYStcbXUtMSQkCgpTdGlsbCB1c2luZyBhIHNpbmdsZSBiZXRhIGhlcmUuCgoKaGFzaGVkIHRoaXMgb3V0IGFzIGl0IGRvZXNudCBydW4gKHNhdmVzIHRpbWUpCgpgYGB7cn0KIyAjIyBkZWNpZGUgdGVzdGluZyByYXRlIChtaW4sbWVkLG1heCBvciBvZmYpCiMgdGVzdGluZygnbWluJykKIyAKIyAjIyBzZXQgdXAgcnVuCiMgc3Rhbm5hbWU9J2JldGFfbWVhbnNkX1JMXzIuc3RhbicKIyAKIyBzdGFuZmlsZSA8LSBmaWxlLnBhdGgoc2NyaXB0ZGlyLCBzdGFubmFtZSkKIyAKIyBmbGFyZV9kYXRhPC1saXN0KG50cmlhbHM9bnRyaWFscyxuc3ViPW5zdWIsc2NyZWFtUGx1cyA9IHQoc2NyZWFtUGx1cyksIHNjcmVhbU1pbnVzPXQoc2NyZWFtTWludXMpLHJhdGluZ3NQbHVzPXQocGx1c19zY2FsZWQpLHJhdGluZ3NNaW51cz10KG1pbnVzX3NjYWxlZCkpCiMgCiMgZmxhcmVfZml0IDwtIHN0YW4oZmlsZSA9IHN0YW5maWxlLCBkYXRhID0gZmxhcmVfZGF0YSwgaXRlcj1jaGFpbl9pdGVyLCBjaGFpbnMgPSBjaGFpbl9uKSAjYWRkIHdvcmtpbmcgZGlyPwojIAojIHNhdmUoZmxhcmVfZml0LCBmaWxlPWZpbGUucGF0aChkYXRhZGlyLCdmbGFyZV9maXRfdGVzdCcpKQojIAojIHRyYWNlcGxvdChmbGFyZV9maXQsJ2xwX18nKQojIAojICMgZXh0cmFjdCBmaXQgZGF0YQojIHN1bW1hcnlfZmxhcmU8LSBzdW1tYXJ5KGZsYXJlX2ZpdCkKIyAKIyAjIGV4dHJhY3QgbW9kZWwgc3VtbWFyeSBkYXRhCgojZmxhcmVfbG9nbGlrZTwtIGV4dHJhY3RfbG9nX2xpayhmbGFyZV9maXQsIHBhcmFtZXRlcl9uYW1lID0gImxvZ2xpayIsIG1lcmdlX2NoYWlucyA9IFRSVUUpCgpgYGAKCmBgYHtyfQojIyBnZXQgc29tZSBiYXNpYyBvdXRwdXQgZGVzY3JpcHRpb25zIHByaW50ZWQgdG8gc2NyZWVuCgojIG91dF9kZXNjcmliZShzdW1tYXJ5X2ZsYXJlKQoKYGBgCgojIyMgTWVhbiBkZWZpbml0aW9uIDMKCm5vdGVkIHRoYXQgdGhlIHNoYXBlIHBhcmFtZXRlcnMgaGF2ZSAgc2xpZ2h0IHZhcmlhdGlvbnMgaW4gZGVmaW5pdGlvbiBhY2NvcmRpbmcgdG8gZGlzY3Vzc2lvbiBbaGVyZV0oaHR0cHM6Ly9zdGF0cy5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTIyMzIvY2FsY3VsYXRpbmctdGhlLXBhcmFtZXRlcnMtb2YtYS1iZXRhLWRpc3RyaWJ1dGlvbi11c2luZy10aGUtbWVhbi1hbmQtdmFyaWFuY2UpLiBVcGRhdGVkIHRoZSBzY3JpcHQgc2xpZ2h0bHkgdG8gcmVmbGVjdCB0aGlzIGJhc2VkIG9uIHRoZSByZXBseSBmcm9tIG9jcmFtLgoKdGhlIGZpcnN0IHNkIHRlcm0gaW4gc2hhcGUgYSBpcyBjaGFuZ2VkIHRvIHZhcmlhbmNlLCBzbyBpdCBjaGFuZ2VzIGZyb206ICAgCgokJFxhbHBoYSA9IFxsZWZ0KFxmcmFjezEtXG11fXtcc2lnbWFeMn0gLSBcZnJhY3sxfXtcbXV9XHJpZ2h0KVxtdV4yJCQKCnRvIAoKJCRcYWxwaGEgPSBcbGVmdChcZnJhY3sxLVxtdX17XHNpZ21hfSAtIFxmcmFjezF9e1xtdX1ccmlnaHQpXG11XjIkJAoKCkNoYW5nZXMgdGhlIHNoYXBlIDIgcGFyYW10ZXIgZGVmaW5pdGlvbiBmcm9tOgoKJCRcYmV0YT1cYWxwaGEgXGxlZnQoXGZyYWN7MX17XG11fS0xXHJpZ2h0KSQkICAgCgp0byAKCgokJFxiZXRhID0gXGxlZnQoXGZyYWN7MS1cbXV9e1xzaWdtYX0gLSBcZnJhY3sxfXtcbXV9XHJpZ2h0KVxtdVxsZWZ0KDEtXG11XHJpZ2h0KSQkCgpCZWNhdXNlIHRoaXMgd29ya3MgYmVzdCwgd2lsbCBhZGQgbG9nbGlrZWxpaGhvZCBjYWxjdWxhdGlvbiBoZXJlLiBCYXNpbmcgdGhpcyBvbiB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBmb3IgdGhlIGJldGEgZGlzdHJpYnV0aW9uIGdpdmVuIHRoZSBwYXJ0aWNpcGFudHMgYWN0dWFsIHJhdGluZ3MgYW5kIHN1ZmZpY2llbnQgcGFyYW10ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24gcGVyIHRyaWFsLgoKPj4+bG9nbGlrW3BdID0gIGxvZ2xpa1twXSArCiAgICAgICAgIGJldGFfbHBkZihyYXRpbmdzUGx1c1t0LHBdfHNoYXBlMV9QbHVzW3QscF0sc2hhcGUyX1BsdXNbdCxwXSkgKwogICAgICAgICBiZXRhX2xwZGYocmF0aW5nc01pbnVzW3QscF18c2hhcGUxX01pbnVzW3QscF0sc2hhcGUyX01pbnVzW3QscF0pCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCkhhc2hlZCB0aGlzIG91dCBhcyBpdCBkb2VzbnQgcnVuIChzYXZlcyB0aW1lKQoKYGBge3J9CiMjIGRlY2lkZSB0ZXN0aW5nIHJhdGUgKG1pbixtZWQsbWF4IG9yIG9mZikKIyB0ZXN0aW5nKCdtaW4nKQojIAojICMjIHNldCB1cCBydW4KIyBzdGFubmFtZT0nYmV0YV9tZWFuc2RfUkxfMy5zdGFuJwojIAojIHN0YW5maWxlIDwtIGZpbGUucGF0aChzY3JpcHRkaXIsIHN0YW5uYW1lKQojIAojIGZsYXJlX2RhdGE8LWxpc3QobnRyaWFscz1udHJpYWxzLG5zdWI9bnN1YixzY3JlYW1QbHVzID0gdChzY3JlYW1QbHVzKSwgc2NyZWFtTWludXM9dChzY3JlYW1NaW51cykscmF0aW5nc1BsdXM9dChwbHVzX3NjYWxlZCkscmF0aW5nc01pbnVzPXQobWludXNfc2NhbGVkKSkKIyAKIyBmbGFyZV9maXQgPC0gc3RhbihmaWxlID0gc3RhbmZpbGUsIGRhdGEgPSBmbGFyZV9kYXRhLCBpdGVyPWNoYWluX2l0ZXIsIGNoYWlucyA9IGNoYWluX24pICNhZGQgd29ya2luZyBkaXI/CiMgCiMgc2F2ZShmbGFyZV9maXQsIGZpbGU9ZmlsZS5wYXRoKGRhdGFkaXIsJ2ZsYXJlX2ZpdF90ZXN0JykpCiMgCiMgdHJhY2VwbG90KGZsYXJlX2ZpdCwnbHBfXycpCiMgCiMgIyBleHRyYWN0IGZpdCBkYXRhCiMgc3VtbWFyeV9mbGFyZTwtIHN1bW1hcnkoZmxhcmVfZml0KQojIAojICMgZXh0cmFjdCBtb2RlbCBzdW1tYXJ5IGRhdGEKIyAKIyBmbGFyZV9sb2dsaWtlPC0gZXh0cmFjdF9sb2dfbGlrKGZsYXJlX2ZpdCwgcGFyYW1ldGVyX25hbWUgPSAibG9nbGlrIiwgbWVyZ2VfY2hhaW5zID0gVFJVRSkKCmBgYAoKYGBge3J9CiMjIGdldCBzb21lIGJhc2ljIG91dHB1dCBkZXNjcmlwdGlvbnMgcHJpbnRlZCB0byBzY3JlZW4KCiMgb3V0X2Rlc2NyaWJlKHN1bW1hcnlfZmxhcmUpCgpgYGAKClRoaXMgbW9kZWwgaXMgc3Vic3RuYXRpYWxseSBiZXR0ZXIgdGhhbiBlaXRoZXIgb2YgdGhlIG90aGVyIHR3by4gVHJhY2VwbG90IHN1Z2dlc3RzIHRoYXQgdGhlIGl0ZXJhdGlvbnMgY29udmVyZ2UgYXMgd2Ugd291bGQgbGlrZS4gSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCB0byBtYXNzaXZlbHkgY29uc3RyYWluIHRoZSBiZXRhIChpLmUuIGNvbmZpZGVuY2UgLyB1bmNlcnRhaW50eSkgZXN0aW1hdGVzIGZvciBpdCB0byBydW4sIG90aGVyd2lzZSB0aGUgc3RhcnRpbmcgdmFsdWVzIGRyb3AgYmVsb3cgemVyby4gCgojIyMjIENyZWF0ZSBCSUMgZnJvbSBsb2cgbGlrZWxpaG9vZAoKYGBge3J9CiMjIGV4dHJhY3QgbG9nIGxpa2VsaWhvb2QKIyAKIyBmbGFyZV9sb2dsaWtlIDwtIGV4dHJhY3RfbG9nX2xpayhmbGFyZV9maXQsIHBhcmFtZXRlcl9uYW1lID0gImxvZ2xpayIsIG1lcmdlX2NoYWlucyA9IFRSVUUpCiMgCiMgI2NhbGN1bGF0ZSBCSUMKIyAKIyBGTEFSZV9iaWM8LWJpYyhudHJpYWxzLC1jb2xNZWFucyhmbGFyZV9sb2dsaWtlKSwyKSAjbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhhdCBtb2RlbCBlLmcuIDQpCiMgCiMgIyMgbWVhbiBCSUMgYXMgbW9kZWwgY29tcGFyaXNvbnMgdG9vbDoKIyAKIyBwcmludCgiTWVhbiBCYXllc2lhbiBpbmZvcm1hdGlvbiBjcml0ZXJpb24gZm9yIG1vZGVsIikKIyBtZWFuKEZMQVJlX2JpYykKCmBgYAoKCiMjIyMgQWRkIHRvIGJhciBwbG90CgpgYGB7cn0KIyAKIyBtb2RfY29tcCA8LSByYmluZChuYS5vbWl0KG1vZF9jb21wLGMoIk1lYW4gMSBiZXRhIixtZWFuKEZMQVJlX2JpYykpKSkKIyAKCiMgcGxvdCA8LSBnZ3Bsb3QobmEub21pdChtb2RfY29tcCksYWVzKHg9bW9kZWwseT1CSUMpKSArCiMgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwojICAgY29vcmRfZmxpcCgpCiMgCiMgc2hvdyhwbG90KQoKYGBgCgojIyMgTWVhbiBkZWZpbml0aW9uIDQKCkhlcmUgSSB0cnkgdG8gZGVmaW5lIHRoZSBwYXJhbWV0ZXIgdXNpbmcgc2ltcGxpZmllZCBtZWFuIGFuZCBwcmVjaXNpb24gZXN0aW1hdGVzIGFzIHBlciBbdGhpcyB0dXRvcmlhbF0oaHR0cDovL3F1YW50ZGV2ZWwuY29tL3B1YmxpYy9DU1AyMDE3L01vZGVsaW5nUHJvcG9ydGlvbnNBbmRQcm9iYWJpbGl0aWVzLnBkZikuIFNlZSBpbiBwYXJ0aWN1bGFyIHRoZSBwYXJhbXRlciBlc3RpbWF0aW9uIG9uIHRoZSBjdWJzIGRhdGEuCgoKVGhpcyByZXN1bHRzIGluIGEgcmVsYXRpdmVseSBzaW1wbGlmaWVkIHBhcmFtdGVyIGVzdGltYXRpb24gY29tcGFyZWQgdG8gbW9kZWwgMy4gCgokJFxhbHBoYSA9IFxtdSAqICgoXG11ICogKDEtXG11KSkgLyBcc2lnbWEgLSAxKSQkCgp3aGVyZSBtdSBpcyB0aGUgbWVhbiAob3IgdmFsdWUpIGFuZCBzaWdtYSBpcyB0aGUgdmFyaWFuY2UgLyB1bmNlcnRhaW50eSBwYXJhbXRlciB3ZSBjdXJyZW50bHkgY2FsbCBiZXRhLgoKYW5kIHRoZSBiIChvciBzaGFwZSAyKSBwYXJhbWV0ZXIgZm9yIHRoZSBkaXN0cmlidXRpb24gaXM6CgokJFxiZXRhID0gKDEtIFxtdSkgKiAoKFxtdSAqICgxLVxtdSkpIC8gXHNpZ21hIC0gMSkkJAoKCgoKYGBge3J9CiMjIGRlY2lkZSB0ZXN0aW5nIHJhdGUgKG1pbixtZWQsbWF4IG9yIG9mZikKdGVzdGluZygnbWluJykKCiMjIHNldCB1cCBydW4Kc3Rhbm5hbWU9J2JldGFfbWVhbnNkX1JMXzQuc3RhbicKCnN0YW5maWxlIDwtIGZpbGUucGF0aChzY3JpcHRkaXIsIHN0YW5uYW1lKQoKZmxhcmVfZGF0YTwtbGlzdChudHJpYWxzPW50cmlhbHMsbnN1Yj1uc3ViLHNjcmVhbVBsdXMgPSB0KHNjcmVhbVBsdXMpLCBzY3JlYW1NaW51cz10KHNjcmVhbU1pbnVzKSxyYXRpbmdzUGx1cz10KHBsdXNfc2NhbGVkKSxyYXRpbmdzTWludXM9dChtaW51c19zY2FsZWQpLGNkZl9zY2FsZT1jZGZfc2NhbGUpCgpmbGFyZV9maXRfYmVzdCA8LSBzdGFuKGZpbGUgPSBzdGFuZmlsZSwgZGF0YSA9IGZsYXJlX2RhdGEsIGl0ZXI9Y2hhaW5faXRlciwgY2hhaW5zID0gY2hhaW5fbikgI2FkZCB3b3JraW5nIGRpcj8KCnNhdmUoZmxhcmVfZml0X2Jlc3QsIGZpbGU9ZmlsZS5wYXRoKGRhdGFkaXIsJ2ZsYXJlX2ZpdF9zaW1wbGVNZWFuJykpCgp0cmFjZXBsb3QoZmxhcmVfZml0X2Jlc3QsJ2xwX18nKQoKIyBleHRyYWN0IGZpdCBkYXRhCnN1bW1hcnlfZmxhcmVfYmVzdCA8LSBzdW1tYXJ5KGZsYXJlX2ZpdF9iZXN0KQoKYGBgCgpgYGB7cn0KIyMgZ2V0IHNvbWUgYmFzaWMgb3V0cHV0IGRlc2NyaXB0aW9ucyBwcmludGVkIHRvIHNjcmVlbgoKb3V0X2Rlc2NyaWJlKHN1bW1hcnlfZmxhcmVfYmVzdCkKCmBgYAoKIyMjIyBDcmVhdGUgQklDIGZyb20gbG9nIGxpa2VsaWhvb2QKCmBgYHtyfQojIyBleHRyYWN0IGxvZyBsaWtlbGlob29kCgpmbGFyZV9sb2dsaWtlX2Jlc3QgPC0gZXh0cmFjdF9sb2dfbGlrKGZsYXJlX2ZpdF9iZXN0LCBwYXJhbWV0ZXJfbmFtZSA9ICJsb2dsaWsiLCBtZXJnZV9jaGFpbnMgPSBUUlVFKQoKI2NhbGN1bGF0ZSBCSUMKCkZMQVJlX2JpYzwtYmljKG50cmlhbHMsLWNvbE1lYW5zKGZsYXJlX2xvZ2xpa2VfYmVzdCksMikgI251bWJlciBvZiBwYXJhbWV0ZXJzIGluIHRoYXQgbW9kZWwgZS5nLiA0KQoKIyMgbWVhbiBCSUMgYXMgbW9kZWwgY29tcGFyaXNvbnMgdG9vbDoKCnByaW50KCJNZWFuIEJheWVzaWFuIGluZm9ybWF0aW9uIGNyaXRlcmlvbiBmb3IgbW9kZWwiKQptZWFuKEZMQVJlX2JpYykKCmBgYAoKCiMjIyMgQWRkIHRvIGJhciBwbG90CgpgYGB7cn0KCm1vZF9jb21wIDwtIHJiaW5kKG1vZF9jb21wLGMoIk1lYW5zIDEgYmV0YSIsbWVhbihGTEFSZV9iaWMpKSkKCgpwbG90IDwtIGdncGxvdChuYS5vbWl0KG1vZF9jb21wKSxhZXMoeD1tb2RlbCx5PUJJQykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGNvb3JkX2ZsaXAoKQoKc2hvdyhwbG90KQoKYGBgCgoKIyMgTW9kZWwgNDogUkwsIG1vZGUgZGVmaW5lZCwgc2luZ2xlIGJldGEgey50YWJzZXR9CgojIyMgbm90ZXMgCgpVc2VkIFt0aGlzIHBvc3RdKGh0dHA6Ly9kb2luZ2JheWVzaWFuZGF0YWFuYWx5c2lzLmJsb2dzcG90LmNvbS8yMDEyLzA2L2JldGEtZGlzdHJpYnV0aW9uLXBhcmFtZXRlcml6ZWQtYnktbW9kZS5odG1sKSB0byBndWlkZSB0aGlzLiBwYXJ0aWN1bGFybHk6Cgo+PkZvciBhIGJldGEgZGlzdHJpYnV0aW9uIHdpdGggc2hhcGUgcGFyYW1ldGVycyBhIGFuZCBiLCB0aGUgbW9kZSBpcyAoYS0xKS8oYStiLTIpLiBTdXBwb3NlIHdlIGhhdmUgYSBkZXNpcmVkIG1vZGUsIGFuZCB3ZSB3YW50IHRvIGRldGVybWluZSB0aGUgY29ycmVzcG9uZGluZyBzaGFwZSBwYXJhbWV0ZXJzLiBIZXJlJ3MgdGhlIHNvbHV0aW9uLiBGaXJzdCwgd2UgZXhwcmVzcyB0aGUgImNlcnRhaW50eSIgb2YgdGhlIGVzdGltYXRlIGluIHRlcm1zIG9mIHRoZSBlcXVpdmFsZW50IHByaW9yIHNhbXBsZSBzaXplLAprPWErYiwgd2l0aCBr4omlMi4gClRoZSBjZXJ0YWludHkgbXVzdCBiZSBhdCBsZWFzdCAyIGJlY2F1c2UgaXQgZXNzZW50aWFsbHkgYXNzdW1lcyB0aGF0IHRoZSBwcmlvciBjb250YWlucyBhdCBsZWFzdCBvbmUgImhlYWQiIGFuZCBvbmUgInRhaWwsIiB3aGljaCBpcyB0byBzYXkgdGhhdCB3ZSBrbm93IGVhY2ggb3V0Y29tZSBpcyBhdCBsZWFzdCBwb3NzaWJsZS4gVGhlbiBhIGxpdHRsZSBhbGdlYnJhIHJldmVhbHM6CmEgPSBtb2RlICogKGstMikgKyAxCmIgPSAoMS1tb2RlKSAqIChrLTIpICsgMQoKCgojIyMgc2hhcGUgMSBhcyBtb2RlIHdpdGggdiBhbmQgYmV0YSBhcyBiZXRhIHNoYXBlIHBhcmFtZXRlcnMgCgpGb3IgdGhpcyB2ZXJzaW9uIHdlIHRyeSBhbmQgZXN0aW1hdGUgdGhlICdtb2RlJyB0byBiZSBzaGFwZSAxLiBLSVJTVElOOjogZXhwbGFpbiBoZXJlCgpgYGB7cn0KIyMgZGVjaWRlIHRlc3RpbmcgcmF0ZSAobWluLG1lZCxtYXggb3Igb2ZmKQojIAojIHRlc3RpbmcoJ3NraXAnKQojIAojICMjIHNldCB1cCBydW4KIyAKIyBzdGFubmFtZT0nYmV0YV9tb2RlX1JMLnN0YW4nCiMgCiMgc3RhbmZpbGUgPC0gZmlsZS5wYXRoKHNjcmlwdGRpciwgc3Rhbm5hbWUpCiMgCiMgZmxhcmVfZGF0YTwtbGlzdChudHJpYWxzPW50cmlhbHMsbnN1Yj1uc3ViLHNjcmVhbVBsdXMgPSB0KHNjcmVhbVBsdXMpLCBzY3JlYW1NaW51cz10KHNjcmVhbU1pbnVzKSxyYXRpbmdzUGx1cz10KHBsdXNfc2NhbGVkKSxyYXRpbmdzTWludXM9dChtaW51c19zY2FsZWQpKQojIAojIGZsYXJlX2ZpdCA8LSBzdGFuKGZpbGUgPSBzdGFuZmlsZSwgZGF0YSA9IGZsYXJlX2RhdGEsIGl0ZXI9Y2hhaW5faXRlciwgY2hhaW5zID0gY2hhaW5fbikgI2FkZCB3b3JraW5nIGRpcj8KIyAKIyBzYXZlKGZsYXJlX2ZpdCwgZmlsZT1maWxlLnBhdGgoZGF0YWRpciwnZmxhcmVfZml0X3NpbXBsZU1vZGUnKSkKIyAKIyB0cmFjZXBsb3QoZmxhcmVfZml0LCdscF9fJykKIyAKIyAjIGV4dHJhY3QgZml0IGRhdGEKIyBzdW1tYXJ5X2ZsYXJlPC0gc3VtbWFyeShmbGFyZV9maXQpCiMgCiMgIyBleHRyYWN0IG1vZGVsIHN1bW1hcnkgZGF0YQojIAojICNmbGFyZV9sb2dsaWtlPC0gZXh0cmFjdF9sb2dfbGlrKGZsYXJlX2ZpdCwgcGFyYW1ldGVyX25hbWUgPSAibG9nbGlrIiwgbWVyZ2VfY2hhaW5zID0gVFJVRSkKCmBgYAoKYGBge3J9CiMjIGdldCBzb21lIGJhc2ljIG91dHB1dCBkZXNjcmlwdGlvbnMgcHJpbnRlZCB0byBzY3JlZW4KCiMgb3V0X2Rlc2NyaWJlKHN1bW1hcnlfZmxhcmUpCgpgYGAKCiMjIyB2IGFzIG1vZGUKCkZvciB0aGlzIHZlcnNpb24gd2UgYXNzdW1lIHRoYXQgViBpcyB0aGUgbW9kZSAoYWJvdmUgd2UgYXNzdW1lZCBpdCBzZXJ2ZXMgYXMgdGhlIG1lYW4pIGFuZCBiZXRhIGlzIHRoZSBjZXJ0YWludHkgYXNwZWN0IChpLmUuIGspCgpXaGF0IHRoaXMgZG9lcyBpcyBiYXNpY2FsbHkgdHJlYXQgdGhlIGV4cGVjdGVkIHJhdGluZyAodmFsdWUpIGFzIHRoZSBhIHBhcmFtZXRlciBmb3IgdGhlIGRpc3RyaWJ1dGlvbiAoc2NhbGVkIGJ5IHRoZWlyIGNlcnRhaW5pdHkgLSBiZXRhKSBhbmQgMS10aGF0IHZhbHVlIGFzIHRoZSBiIHBhcmFtZXRlciAoYWdhaW4sIHNjYWxlZCBieSB0aGUgdW5jZXJ0YWludHkpLiAKCnNvIHlvdSBoYXZlIGEgcmF0aW8gb2YgdGhlaXIgc2VsZWN0ZWQgdmFsdWUgcGVyIHRyaWFsIChtb2RlIGFjcm9zcyBpdGVyYXRpb25zPykgdG8gaG93IGZhciBmcm9tIHRoZSBoaWdoZXN0IHBvc3NpYmxlIGNob2ljZSB0aGV5IGFyZS4KYGBge3J9CgojIyBkZWNpZGUgdGVzdGluZyByYXRlIChtaW4sbWVkLG1heCBvciBvZmYpCnRlc3RpbmcoJ21pbicpCgojIyBzZXQgdXAgcnVuCnN0YW5uYW1lPSdiZXRhX21vZGVfUkxfMi5zdGFuJwoKc3RhbmZpbGUgPC0gZmlsZS5wYXRoKHNjcmlwdGRpciwgc3Rhbm5hbWUpCgpmbGFyZV9kYXRhPC1saXN0KG50cmlhbHM9bnRyaWFscyxuc3ViPW5zdWIsc2NyZWFtUGx1cyA9IHQoc2NyZWFtUGx1cyksIHNjcmVhbU1pbnVzPXQoc2NyZWFtTWludXMpLHJhdGluZ3NQbHVzPXQocGx1c19zY2FsZWQpLHJhdGluZ3NNaW51cz10KG1pbnVzX3NjYWxlZCksY2RmX3NjYWxlPWNkZl9zY2FsZSkKCmZsYXJlX2ZpdCA8LSBzdGFuKGZpbGUgPSBzdGFuZmlsZSwgZGF0YSA9IGZsYXJlX2RhdGEsIGl0ZXI9Y2hhaW5faXRlciwgY2hhaW5zID0gY2hhaW5fbikgI2FkZCB3b3JraW5nIGRpcj8KCnNhdmUoZmxhcmVfZml0LCBmaWxlPWZpbGUucGF0aChkYXRhZGlyLCdmbGFyZV9maXRfdGVzdCcpKQoKdHJhY2VwbG90KGZsYXJlX2ZpdCwnbHBfXycpCgojIGV4dHJhY3QgZml0IGRhdGEKc3VtbWFyeV9mbGFyZTwtIHN1bW1hcnkoZmxhcmVfZml0KQoKCmBgYAoKYGBge3J9CiMjIGdldCBzb21lIGJhc2ljIG91dHB1dCBkZXNjcmlwdGlvbnMgcHJpbnRlZCB0byBzY3JlZW4KCm91dF9kZXNjcmliZShzdW1tYXJ5X2ZsYXJlKQoKYGBgCgoKVGhpcyB3b3JrcywgYnV0IHRoZXJlIGlzIG5vdCBhIGxvdCBvZiB2YXJpYW5jZSBpbiB0aGUgYWxwaGEgcGFyYW10ZXIgd2hlbiBkZXNjcmliZWQgYnkgbW9kZSBtZWFuIDAuNDk7IHNkID0gMC4wNi4gQ29tcGFyZWQgdG8gZGVmaW5lZCBieSBtZWFuIHdoZXJlIG1lYW4gaXMgMC41NCBhbmQgc2QgaXMgMC4yNi4KCkhvd2V2ZXIgdGhlcmUgaXMgYSBsb3Qgb2YgdmFyaWF0aW9uIGluIHRoZSBiZXRhIHBhcmFtdGVyIChtZWFuIC03LjIxLCBzZCA9IDEzNC43NCkKCiMjIyMgQ3JlYXRlIEJJQyBmcm9tIGxvZyBsaWtlbGlob29kCgpgYGB7cn0KIyMgZXh0cmFjdCBsb2cgbGlrZWxpaG9vZAoKZmxhcmVfbG9nbGlrZSA8LSBleHRyYWN0X2xvZ19saWsoZmxhcmVfZml0LCBwYXJhbWV0ZXJfbmFtZSA9ICJsb2dsaWsiLCBtZXJnZV9jaGFpbnMgPSBUUlVFKQoKI2NhbGN1bGF0ZSBCSUMKCkZMQVJlX2JpYzwtYmljKG50cmlhbHMsLWNvbE1lYW5zKGZsYXJlX2xvZ2xpa2UpLDIpICNudW1iZXIgb2YgcGFyYW1ldGVycyBpbiB0aGF0IG1vZGVsIGUuZy4gNCkKCiMjIG1lYW4gQklDIGFzIG1vZGVsIGNvbXBhcmlzb25zIHRvb2w6CgpwcmludCgiTWVhbiBCYXllc2lhbiBpbmZvcm1hdGlvbiBjcml0ZXJpb24gZm9yIG1vZGVsIikKbWVhbihGTEFSZV9iaWMpCgpgYGAKCgojIyMjIEFkZCB0byBiYXIgcGxvdAoKYGBge3J9CiMgCiBtb2RfY29tcCA8LSByYmluZChuYS5vbWl0KG1vZF9jb21wKSxjKCJNb2RlIDEgYmV0YSIsbWVhbihGTEFSZV9iaWMpKSkKIyAKCnBsb3QgPC0gZ2dwbG90KG5hLm9taXQobW9kX2NvbXApLGFlcyh4PW1vZGVsLHk9QklDKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgY29vcmRfZmxpcCgpCiMKc2hvdyhwbG90KQoKYGBgCiMjIE1vZGVsIDU6IFJMIG1lYW4gZGVmaW5lZCx0d28gYmV0YSB7LnRhYnNldH0KCiMjIyBtZWFuIHNkIFJMIG1vZGVsIHdpdGggYmV0YSBwZXIgc3RpbXVsdXMKClJMIG1vZGVsIGFkZGluZyBhIGJldGEgcGVyIHN0aW11bHVzIHRvIEFsZXgncyBtb2RlbAoKYGBge3J9CiMjIGRlY2lkZSB0ZXN0aW5nIHJhdGUgKG1pbixtZWQsbWF4IG9yIG9mZikKdGVzdGluZygnbWluJykKCiMjIHNldCB1cCBydW4Kc3Rhbm5hbWU9J2JldGFfbWVhbnNkXzJiZXRhX1JMLnN0YW4nCgpzdGFuZmlsZSA8LSBmaWxlLnBhdGgoc2NyaXB0ZGlyLCBzdGFubmFtZSkKCmZsYXJlX2RhdGE8LWxpc3QobnRyaWFscz1udHJpYWxzLG5zdWI9bnN1YixzY3JlYW1QbHVzID0gdChzY3JlYW1QbHVzKSwgc2NyZWFtTWludXM9IHQoc2NyZWFtTWludXMpLHJhdGluZ3NQbHVzPXQocGx1c19zY2FsZWQpLHJhdGluZ3NNaW51cz10KG1pbnVzX3NjYWxlZCksY2RmX3NjYWxlPWNkZl9zY2FsZSkKCmZsYXJlX2ZpdF9tMiA8LSBzdGFuKGZpbGUgPSBzdGFuZmlsZSwgZGF0YSA9IGZsYXJlX2RhdGEsIGl0ZXI9Y2hhaW5faXRlcix3YXJtdXAgPSB3YXJtX3VwLCBjaGFpbnMgPSBjaGFpbl9uKSAjYWRkIHdvcmtpbmcgZGlyPwoKc2F2ZShmbGFyZV9maXRfbTIsIGZpbGU9ZmlsZS5wYXRoKGRhdGFkaXIsJ2ZsYXJlX2ZpdF8yYmV0YU1lYW4nKSkKCnRyYWNlcGxvdChmbGFyZV9maXRfbTIsJ2xwX18nKQoKIyBleHRyYWN0IGZpdCBkYXRhCnN1bW1hcnlfZmxhcmVfbTIgPC0gc3VtbWFyeShmbGFyZV9maXRfbTIpCgpgYGAKCmBgYHtyfQojIyBnZXQgc29tZSBiYXNpYyBvdXRwdXQgZGVzY3JpcHRpb25zIHByaW50ZWQgdG8gc2NyZWVuCgpvdXRfZGVzY3JpYmUoc3VtbWFyeV9mbGFyZV9tMikKCmBgYAoKIyMjIyBDcmVhdGUgQklDIGZyb20gbG9nIGxpa2VsaWhvb2QKCmBgYHtyfQojIyBleHRyYWN0IGxvZyBsaWtlbGlob29kCgpmbGFyZV9sb2dsaWtlX20yIDwtIGV4dHJhY3RfbG9nX2xpayhmbGFyZV9maXRfbTIsIHBhcmFtZXRlcl9uYW1lID0gImxvZ2xpayIsIG1lcmdlX2NoYWlucyA9IFRSVUUpCgojY2FsY3VsYXRlIEJJQwoKRkxBUmVfYmljX20yIDwtIGJpYyhudHJpYWxzLC1jb2xNZWFucyhmbGFyZV9sb2dsaWtlX20yKSwzKSAjbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhhdCBtb2RlbCBlLmcuIDQpCgojIG1lYW4gZm9yIGFsbCBwYXJ0aWNpcGFudHMKCm1lYW4oRkxBUmVfYmljX20yKQoKYGBgCgoKIyMjIyBBZGQgdG8gYmFyIHBsb3QKCmBgYHtyfQoKbW9kX2NvbXAgPC0gcmJpbmQobW9kX2NvbXAsYygiTWVhbnMgMiBiZXRhIixtZWFuKEZMQVJlX2JpY19tMikpKQoKcGxvdCA8LSBnZ3Bsb3QobmEub21pdChtb2RfY29tcCksYWVzKHg9bW9kZWwseT1CSUMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBjb29yZF9mbGlwKCkKCnNob3cocGxvdCkKCmBgYAoKIyMgTW9kZWwgNjogUkwgbW9kZSBkZWZpbmVkLHR3byBiZXRhIHsudGFic2V0fQoKIyMjIG1vZGUgc2QgUkwgbW9kZWwgd2l0aCBiZXRhIHBlciBzdGltdWx1cwoKUkwgbW9kZWwgYWRkaW5nIGEgYmV0YSBwZXIgc3RpbXVsaSB0byBtb2RlbCBkZWZpbmluZyB0aGUgYmV0YSBzaGFwZSB1c2luZyB0aGUgbW9kZSBpbnN0ZWFkIG9mIHRoZSBtZWFuLiBUaGlzIGRlZmluaXRlbHkgbWFrZXMgbW9yZSBzZW5zZSBhcyB3ZSBhc3N1bWUgdGhhdCB0aGV5IHdpbGwgaGF2ZSBkaWZmZXJlbnQgbGV2ZWxzIG9mIHVuY2VydGFpbnR5IGFib3V0IGVhY2guIAoKYGBge3J9CiMjIGRlY2lkZSB0ZXN0aW5nIHJhdGUgKG1pbixtZWQsbWF4IG9yIG9mZikKdGVzdGluZygnbWluJykKCiMjIHNldCB1cCBydW4Kc3Rhbm5hbWU9J2JldGFfbW9kZV8yYmV0YV9STF8yLnN0YW4nCgpzdGFuZmlsZSA8LSBmaWxlLnBhdGgoc2NyaXB0ZGlyLCBzdGFubmFtZSkKCmZsYXJlX2RhdGE8LWxpc3QobnRyaWFscz1udHJpYWxzLG5zdWI9bnN1YixzY3JlYW1QbHVzID0gdChzY3JlYW1QbHVzKSwgc2NyZWFtTWludXM9IHQoc2NyZWFtTWludXMpLHJhdGluZ3NQbHVzPXQocGx1c19zY2FsZWQpLHJhdGluZ3NNaW51cz10KG1pbnVzX3NjYWxlZCkpCgpmbGFyZV9maXQgPC0gc3RhbihmaWxlID0gc3RhbmZpbGUsIGRhdGEgPSBmbGFyZV9kYXRhLCBpdGVyPWNoYWluX2l0ZXIsIGNoYWlucyA9IGNoYWluX24pICNhZGQgd29ya2luZyBkaXI/CgpzYXZlKGZsYXJlX2ZpdCwgZmlsZT1maWxlLnBhdGgoZGF0YWRpciwnZmxhcmVfZml0X3Rlc3QnKSkKCnRyYWNlcGxvdChmbGFyZV9maXQsJ2xwX18nKQoKIyBleHRyYWN0IGZpdCBkYXRhCnN1bW1hcnlfZmxhcmUgPC0gc3VtbWFyeShmbGFyZV9maXQpCgojIGV4dHJhY3QgbW9kZWwgc3VtbWFyeSBkYXRhCgojZmxhcmVfbG9nbGlrZTwtIGV4dHJhY3RfbG9nX2xpayhmbGFyZV9maXQsIHBhcmFtZXRlcl9uYW1lID0gImxvZ2xpayIsIG1lcmdlX2NoYWlucyA9IFRSVUUpCgoKYGBgCgpgYGB7cn0KIyMgZ2V0IHNvbWUgYmFzaWMgb3V0cHV0IGRlc2NyaXB0aW9ucyBwcmludGVkIHRvIHNjcmVlbgoKb3V0X2Rlc2NyaWJlKHN1bW1hcnlfZmxhcmUpCgpgYGAKCgpUaGUgYWxwaGEgcGFyYW1ldGVyIHZhcmlhbmNlIGlzIG5vcm1hbCAobWVhbiAwLjQgYW5kIHNkIDAuMTIpLiBCZXRhIGlzIG11Y2ggbW9yZSBib3VuZGVkIG5vdyB0aG91Z2ggKGNvbWJpbmVkIGFjcm9zcyBib3RoIHN0aW11bGkgbWVhbiAwLjc5LCBzZD0xLjYpIG92ZXIgNDAwMCBpdGVyYXRpb25zIG9uIDQgY2hhaW5zLgoKCiMjIyMgQ3JlYXRlIEJJQyBmcm9tIGxvZyBsaWtlbGlob29kCgpgYGB7cn0KIyMgZXh0cmFjdCBsb2cgbGlrZWxpaG9vZAoKZmxhcmVfbG9nbGlrZSA8LSBleHRyYWN0X2xvZ19saWsoZmxhcmVfZml0LCBwYXJhbWV0ZXJfbmFtZSA9ICJsb2dsaWsiLCBtZXJnZV9jaGFpbnMgPSBUUlVFKQoKI2NhbGN1bGF0ZSBCSUMKCkZMQVJlX2JpYzwtYmljKG50cmlhbHMsLWNvbE1lYW5zKGZsYXJlX2xvZ2xpa2UpLDIpICNudW1iZXIgb2YgcGFyYW1ldGVycyBpbiB0aGF0IG1vZGVsIGUuZy4gNCkKCiMjIG1lYW4gQklDIGFzIG1vZGVsIGNvbXBhcmlzb25zIHRvb2w6CgpwcmludCgiTWVhbiBCYXllc2lhbiBpbmZvcm1hdGlvbiBjcml0ZXJpb24gZm9yIG1vZGVsIikKbWVhbihGTEFSZV9iaWMpCgpgYGAKCiMjIyMgQWRkIHRvIGJhciBwbG90CgpgYGB7cn0KCm1vZF9jb21wIDwtIHJiaW5kKG5hLm9taXQobW9kX2NvbXApLGMoIk1vZGUgMiBiZXRhIixtZWFuKEZMQVJlX2JpYykpKQoKcGxvdCA8LSBnZ3Bsb3QobW9kX2NvbXAsYWVzKHg9bW9kZWwseT1CSUMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBjb29yZF9mbGlwKCkKCnNob3cocGxvdCkKCmBgYAoKIyMgTW9kZWwgNzogUkwgbWVhbiBkZWZpbmVkLCBubyBiZXRhIHsudGFic2V0fQoKIyMjIG1lYW4gc2QgUkwgbW9kZWwgd2l0aCBubyBiZXRhIChvbmx5IGFscGhhKQoKVGhlIGJldGEgZG9lc250IHdvcmsgYXMgd2VsbCBmb3IgdGhlIENTKyBzdGltdWx1cywgbmVlZCB0byBjaGVjayBpZiB0aGlzIHBhcmFtdGVyIGFkZHMgYW55dGhpbmcgdG8gdGhlIG1vZGVsIC0gZHJvcCBpdCBmcm9tIG91ciBiZXN0IG1lYW4gbW9kZWwgYW5kIHNlZSBob3cgdGhpcyBjaGFuZ2VzIHRoZSBmaXQuCgpgYGB7cn0KCiMjIGRlY2lkZSB0ZXN0aW5nIHJhdGUgKG1pbixtZWQsbWF4IG9yIG9mZikKdGVzdGluZygnbWluJykKIyB0cnkgYSB3ZWFrbHkgaW5mb3JtYXRpdmUgcHJpb3IKI04wdyA8LSBub3JtYWwoMCwgMTAwKQoKCiMjIHNldCB1cCBydW4Kc3Rhbm5hbWU9J2JldGFfbWVhbnNkX1JMX05vQmV0YS5zdGFuJwoKc3RhbmZpbGUgPC0gZmlsZS5wYXRoKHNjcmlwdGRpciwgc3Rhbm5hbWUpCgpmbGFyZV9kYXRhPC1saXN0KG50cmlhbHM9bnRyaWFscyxuc3ViPW5zdWIsc2NyZWFtUGx1cyA9IHQoc2NyZWFtUGx1cyksIHNjcmVhbU1pbnVzPSB0KHNjcmVhbU1pbnVzKSxyYXRpbmdzUGx1cz10KHBsdXNfc2NhbGVkKSxyYXRpbmdzTWludXM9dChtaW51c19zY2FsZWQpKQoKZmxhcmVfZml0IDwtIHN0YW4oZmlsZSA9IHN0YW5maWxlLCBkYXRhID0gZmxhcmVfZGF0YSwgaXRlcj1jaGFpbl9pdGVyLCBjaGFpbnMgPSBjaGFpbl9uKSAjYWRkIHdvcmtpbmcgZGlyPwoKc2F2ZShmbGFyZV9maXQsIGZpbGU9ZmlsZS5wYXRoKGRhdGFkaXIsJ2ZsYXJlX2ZpdF90ZXN0JykpCgp0cmFjZXBsb3QoZmxhcmVfZml0LCdscF9fJykKCiMgZXh0cmFjdCBmaXQgZGF0YQpzdW1tYXJ5X2ZsYXJlIDwtIHN1bW1hcnkoZmxhcmVfZml0KQoKIyBleHRyYWN0IG1vZGVsIHN1bW1hcnkgZGF0YQoKI2ZsYXJlX2xvZ2xpa2U8LSBleHRyYWN0X2xvZ19saWsoZmxhcmVfZml0LCBwYXJhbWV0ZXJfbmFtZSA9ICJsb2dsaWsiLCBtZXJnZV9jaGFpbnMgPSBUUlVFKQoKCmBgYAoKYGBge3J9CiMjIGdldCBzb21lIGJhc2ljIG91dHB1dCBkZXNjcmlwdGlvbnMgcHJpbnRlZCB0byBzY3JlZW4KCm91dF9kZXNjcmliZShzdW1tYXJ5X2ZsYXJlKQoKYGBgCgoKCgoKIyMjIyBDcmVhdGUgQklDIGZyb20gbG9nIGxpa2VsaWhvb2QKCmBgYHtyfQojIyBleHRyYWN0IGxvZyBsaWtlbGlob29kCgpmbGFyZV9sb2dsaWtlIDwtIGV4dHJhY3RfbG9nX2xpayhmbGFyZV9maXQsIHBhcmFtZXRlcl9uYW1lID0gImxvZ2xpayIsIG1lcmdlX2NoYWlucyA9IFRSVUUpCgojY2FsY3VsYXRlIEJJQwoKRkxBUmVfYmljPC1iaWMobnRyaWFscywtY29sTWVhbnMoZmxhcmVfbG9nbGlrZSksMikgI251bWJlciBvZiBwYXJhbWV0ZXJzIGluIHRoYXQgbW9kZWwgZS5nLiA0KQoKIyMgbWVhbiBCSUMgYXMgbW9kZWwgY29tcGFyaXNvbnMgdG9vbDoKCnByaW50KCJNZWFuIEJheWVzaWFuIGluZm9ybWF0aW9uIGNyaXRlcmlvbiBmb3IgbW9kZWwiKQptZWFuKEZMQVJlX2JpYykKCmBgYAoKIyMjIyBBZGQgdG8gYmFyIHBsb3QKCmBgYHtyfQoKbW9kX2NvbXAgPC0gcmJpbmQobmEub21pdChtb2RfY29tcCksYygiTWVhbiBubyBiZXRhIixtZWFuKEZMQVJlX2JpYykpKQoKcGxvdCA8LSBnZ3Bsb3QobW9kX2NvbXAsYWVzKHg9bW9kZWwseT1CSUMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBjb29yZF9mbGlwKCkKCnNob3cocGxvdCkKCmBgYAoKIyBHZW5lcmF0ZSBhbmQgcmVjb3ZlciAKCkhlcmUgSSB0ZXN0IHdoZXRoZXIgdGhlIG1vZGVsIGlzIHdvcmtpbmcgd2VsbCBieSBzZWVpbmcgaWYgSSBjYW4gdXNlIHRoZSBwYXJhbWV0ZXJzIHdlJ3ZlIGVzdGltYXRlZCB0byB0cnkgYW5kIGdlbmVyYXRlIG91ciBleGlzdGluZyByYXRpbmcgZGF0YSBhbmQgdGhlbiByZWNvdmVyIHNpbWlsYXIgcGFyYW10ZXJzIGFnYWluLgoKSSB3aWxsIGRvIHRoaXMgZm9yIHRoZSBiZXN0IGZpdHRpbmcgbW9kZWwgKG1lYW4gZGVmaW5lZCBiZXRhIGRpc3RyaWJ1dGlvbiB3aXRoIGEgdmFyaWFuY2UgZXN0aW1hdGUgcGVyIHBlcnNvbiBmb3IgZWFoYyBzdGltdWx1cykgVGhpcyBpcyB0aGUgbW9kZWwgd2hlcmUgd2UgdHJlYXQgdGhlIGl0ZXJhcnRlZCByYXRpbmdzIGFzIGlmIHRoZXkgYXJlICdleHBlY3RlZCcgdmFsdWVzIGFuZCB1c2UgdGhpcyBhcyBzaGFwZSAxIHBhcmFtdGVyIGZvciBvdXIgYmV0YSBkaXN0cmlidXRpb24gYXQgZWFjaCB0cmlhbC4gV2UgaGF2ZSBhbGxvd2VkIGEgYmV0YSAob3IgdW5jZXJ0YWludHkpIHBhcmFtdGVyIHBlciBzdGltdWx1cy4KCkEgZ29vZCBtb2RlbCB3aWxsIGhhdmUgKiphKSoqIGEgZ29vZCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHJlYWwgZGF0YSBhbmQgdGhlIGRhdGEgZ2VuZXJhdGVkIGFuZCAqKmIpKiogYSBnb29kIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHBhcmFtZXRlciBlc3RpbWF0ZXMgZnJvbSB0aGUgcmVhbCBhbmQgZ2VuZXJhdGVkIGRhdGEuCgpXZSBiYXNpY2FsbHkgd2FudCB0byByZXBsaWNhdGUgb3VyIHN0YW4gc2NyaXB0LCBidXQgaW5hdGVhZCBvZiBlc3RpbWF0aW5nIHBhcmF0bWVycywgd2Ugd2FudCB0byBhc3N1bWUgdGhhdCB3ZSBrbm93IHdoYXQgdGhlIHBhcmFtZXRlcnMgYXJlIChpLmUuIHVzZSB0aGUgYWxwaGEgYW5kIGJldGEncyB3ZSBoYXZlIGVzdGltYXRlZCBwcmV2aW91c2x5KS4KCioqdXBkYXRlKio6IHR1cm5zIG91dCBzaW5nbGUgYmV0YSBpcyB0aGUgYmVzdCBmaXR0aW5nIG1vZGVsIHdoZW4gSSBjb3JyZWN0IG15IEJJQyBmdW5jdGlvbiB0byBpbmNsdWRlIHRoZSBuZWdhdGl2ZSBsb2cgbGlrZWxpaG9vZC4gU28gd2lsbCBhbHNvIGdlbmVyYXRlIGFuZCByZWNvdmVyIGZvciB0aGlzIG1vZGVsIGFuZCB1c2UgdGhpcyBhcyB0aGUgY29tcGFyYXRvci4KCgojIyBNZWFuIDEgYmV0YQojIyMgR2VuZXJhdGUgCiMjIyMjIE1ha2UgYWxwaGEgLyBiZXRhIGRhdGFzZXRzIHAvcAoKVXNlIHRoZSBzdW1tYXJ5IG9mIHRoZSBzdGFuIG1vZGVsIHRvIGV4dHJhY3QgdGhlIGRpZmZlcmVudCBwYXJhbXRlcnMgd2Ugd2FudCB0byB0cnkgdG8gdXNlIHRvIHJlY3JlYXRlIG91ciBkYXRhLgoKYGBge3J9CgpwYXJhbXMgPC0gc3VtbWFyeShmbGFyZV9maXRfYmVzdCkKYWxwaGFfZXN0IDwtIGRhdGEuZnJhbWUocGFyYW1zJHN1bW1hcnlbMTozNDIsMV0pCmJldGEgPC0gZGF0YS5mcmFtZShwYXJhbXMkc3VtbWFyeVszNDM6Njg1XSkKCgpuYW1lcyhiZXRhKSA8LSAiYmV0YSIKCmBgYAoKIyMjIyMgSW5pdGlhbGlzZSBlbXB0eSBkYXRhc2V0cyB0byBob2xkIHRoZSBwcmVkaWN0ZWQgcmF0aW5ncwoKYGBge3J9CgpyYXRpbmdfZXN0X3BsdXMgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCnJhdGluZ19lc3RfbWludXMgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCgojIGJldGEgc2hhcGUgcGFyYW10ZXJzCnNoYXBlMXAgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCnNoYXBlMW0gPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCnNoYXBlMnAgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCnNoYXBlMm0gPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCgojIFYgcGFyYW1ldGVycyAoaW5pdGlhbGlzZWQgYXQgMC41KQp2cCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPW50cmlhbHMsbnJvdz1uc3ViKSkKdm0gPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCgp2cFsxXSA8LSAwLjUKdm1bMV0gPC0gMC41CgojIHByZWRpY3Rpb24gZXJyb3IgCgpkcCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPShudHJpYWxzLTEpLG5yb3c9bnN1YikpIApkbSA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPShudHJpYWxzLTEpLG5yb3c9bnN1YikpIAoKICAKYGBgCgojIyMjIyBTaW11bGF0ZSByYXRpbmdzCgpVc2Ugb3VyIGV4dHJhY3RlZCBwYXJhbXRlcnMgaW4gcGxhY2Ugb2YgZXN0aW1hdGluZyB0aGUgc2FtZS4gVXNlIHRoZSBzdGFuIHN5bnRheAoKCiMjIyMjIyAgUG9wdWxhdGUgb3VyIHZwbHVzIGFuZCBkZWx0YSBmcmFtZXMKCnVzZSB0aGUgYWxwaGEgcGFyYW10ZXJzIHdlJ3ZlIGV4dHJhY3RlZCAoYWxwaGFfZXN0KQpkID09IGRlbHRhIChwcmVjZGljdGlvbiBlcnJvcikKdiA9PSB2YWx1ZSAoaS5lLiB2YWx1ZSBmb3IgZWFjaCBzdGltdWx1cykKCgpgYGB7cn0KCmZvciAocCBpbiAxOm5zdWIpewogIGZvciAodCBpbiAxOihudHJpYWxzLTEpKXsKICAgICAgZHBbcCx0XSA8LSBzY3JlYW1QbHVzW3AsdF0tdnBbcCx0XQogICAgICBkbVtwLHRdIDwtIHNjcmVhbU1pbnVzW3AsdF0tdm1bcCx0XQogICAgICB2cFtwLHQrMV0gPC0gdnBbcCx0XSthbHBoYV9lc3RbcCwxXSpkcFtwLHRdCiAgICAgIHZtW3AsdCsxXTwtIHZtW3AsdF0rYWxwaGFfZXN0W3AsMV0qZHBbcCx0XQogICAgfQp9CgpgYGAKCiAgICBmb3IgKHQgaW4gMTpudHJpYWxzKXsKICAgICAgc2hhcGUxX1BsdXNbdCxwXSA9IFZQbHVzW3QscF0gKiAoKFZQbHVzW3QscF0gKiAoMS1WUGx1c1t0LHBdKSkgLyBiZXRhW3AsMV0pOwogICAgICBzaGFwZTFfTWludXNbdCxwXSA9IFZNaW51c1t0LHBdICogKChWTWludXNbdCxwXSAqICgxLVZNaW51c1t0LHBdKSkgLyBiZXRhW3AsMl0pOwogICAgICBzaGFwZTJfUGx1c1t0LHBdID0gKDEtVlBsdXNbdCxwXSkgKiAoKFZQbHVzW3QscF0gKiAoMS1WUGx1c1t0LHBdKSkgLyBiZXRhW3AsMV0pOwogICAgICBzaGFwZTJfTWludXNbdCxwXSA9ICgxLVZNaW51c1t0LHBdKSAqICgoVk1pbnVzW3QscF0gKiAoMS1WTWludXNbdCxwXSkpIC8gYmV0YVtwLDJdKTsKCiAgICAgIHJhdGluZ3NQbHVzW3QscF0gfiBiZXRhKHNoYXBlMV9QbHVzW3QscF0sc2hhcGUyX1BsdXNbdCxwXSk7CiAgICAgIHJhdGluZ3NNaW51c1t0LHBdIH4gYmV0YShzaGFwZTFfTWludXNbdCxwXSxzaGFwZTJfTWludXNbdCxwXSk7CiAgICB9CiAgfQp9CgoKIyMjIyMjIHBvcHVsYXRlIGJldGEgcGFyYW1ldGVyIHNoYXBlIGZyYW1lcwoKVXNlIHRoZSBuZXcgdiBmcmFtZXMgYW5kIGJldGEgcGFyYW1ldGVycy4KClNoYXBlIDEgYW5kIDIgYXJlIHN1ZmZpY2llbnQgcGFyYW10ZXJzIGZvciB0aGUgYmV0YSBkaXN0cmlidXRpb24KCmBgYHtyfQoKZm9yIChwIGluIDE6bnN1Yil7CiAgCiAgZm9yICh0IGluIDE6bnRyaWFscyl7CiAgICAKICAgICAgc2hhcGUxcFtwLHRdID0gdnBbcCx0XSAqICgodnBbcCx0XSAqICgxLXZwW3AsdF0pKSAvIGJldGFbcCwxXSkKICAgICAgc2hhcGUxbVtwLHRdID0gdm1bcCx0XSAqICgodm1bcCx0XSAqICgxLXZtW3AsdF0pKSAvIGJldGFbcCwxXSkKICAgICAgc2hhcGUycFtwLHRdID0gKDEtdnBbcCx0XSkgKiAoKHZwW3AsdF0gKiAoMS12cFtwLHRdKSkgLyBiZXRhW3AsMV0pCiAgICAgIHNoYXBlMm1bcCx0XSA9ICgxLXZtW3AsdF0pICogKCh2bVtwLHRdICogKDEtdm1bcCx0XSkpIC8gYmV0YVtwLDFdKQogICAgICAKICB9Cn0KICAKCmBgYAoKCiMjIyMjIyBFc3RpbWF0ZSByYXRpbmdzCgoKdHJ5aW5nIHRvIHVzZSBwYmV0YSBoZXJlIChkZXJpdmVzIHRoZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gZ2l2ZW1uIGEgc2V0IG9mIHByb2JhYmlsaXRpZXMpIAoKRm9yIG5vdywgc2V0dGluZyBwcm9iYWJpbGl0aWVzIGJldHdlZW4gMCBhbmQgMSBhbmQgdGFraW5nIHRoZSBhdmVyYWdlLi4uCmBgYHtyfQoKCmZvciAocCBpbiAxOm5zdWIpewogIAogIGZvciAodCBpbiAxOm50cmlhbHMpewogICAgCiAgICByYXRpbmdfZXN0X3BsdXNbcCx0XSA8LSBtZWFuKHJiZXRhKDEwMDAsc2hhcGUxcFtwLHRdLHNoYXBlMnBbcCx0XSkpCiAgICByYXRpbmdfZXN0X21pbnVzW3AsdF0gPC0gbWVhbihyYmV0YSgxMDAwLHNoYXBlMW1bcCx0XSxzaGFwZTJtW3AsdF0pKQogICAgCiAgfQp9CgoKYGBgCgojIyMjIFJlc2NhbGUgc2ltdWxhdGVkIHJhdGluZ3MKCllvdSBjb3VsZCBhcmd1ZSB0aGF0IHRoZXNlIHNob3VsZCBtYXRjaCB0aGUgZGlzY3JldGUgc2NhbGUgbmF0dXJlIG9mIHRoZSBvcmlnaW5hbCByYXRpbmdzLiBXZSBlZmZlY3RpdmVseSB1bmRpZCB0aGlzIGluIG91ciBzY3JpcHQuIFRoZSBmb2xsb3dpbmcgd2lsbCBlbmFibGUgdGhpcy4KCkhPV0VWRVI6IHdlIGFyZSByZWRjdWNpbmcgdmFyaWFuY2UgbWFzc2l2ZWx5IHRoaXMgd2F5LCBzbyB0aGluayBpdCBtaWdodCBiZSBiZXR0ZXIgdG8gbGVhdmUgdGhlIHJlY292ZXJlZCByYXRpbmdzIHVuc2NhbGVzLi4uLgoKU28gLSB0aGUgZm9sbG93aW5nIGRpc2NyZXRlIHZhbHVlcyBleGlzdCBpbiBvdXIgcmVzY2FsZWQgcmF0aW5nczoKYGBge3J9Cgp0YWJsZShwbHVzX3NjYWxlZCRYMSkKCmBgYAoKV2lsbCBtYWtlIGl0IHRoYXQgYW55dGhpbmcgdGhhdCBmYWxscyAwLjA1NTU1NTU2IGFib3ZlIG9yIGJlbG93IG9uZSBvZiB0aGVzZSB2YWx1ZXMgaXMgc2V0IHRvIHRoaXMgbWVkaWFuIHBvaW50LiBOb3RlIHRoYXQgdGhpcyBpcyBvdXIgY2RmX3NjYWxlIGZhY3RvciB0aGF0IHdlIHVzZWQgaW4gdGhlIHNjcmlwdCB0byBjYXB0dXJlIHRoZSBmdWxsIGFyZWEgdW5kZXIgdGhlIGN1cnZlIGZvciBlYWNoIHNlZ21lbnQgb2YgdGhlIGRpc3RyaWJ1dGlvbiByZXByZXNlbnRlZCBieSB0aGUgZGlzY3JldGUgcmF0aW5ncyBvZiAxLTkuCgpXcml0ZSB0aGUgZnVuY3Rpb24gdG8gcmVzY2FsZQoKYGBge3J9CgoKc2NhbGVfc2ltdWxhdGVkIDwtIGZ1bmN0aW9uKHgpewogIAogIHNjYWxlZF9saXN0IDwtIGFycmF5KHVuaXF1ZShwbHVzX3NjYWxlZCRYMSkpCiAgCiAgZm9yICh2YWwgaW4gc2NhbGVkX2xpc3RbMTpsZW5ndGgoc2NhbGVkX2xpc3QpXSl7CiAgICBpZiAoeCA+IHZhbC1jZGZfc2NhbGUgJiB4IDwgdmFsK2NkZl9zY2FsZSl7CiAgICAgIAogICAgICB4IDwtIHZhbAogICAgfQogIH0KICByZXR1cm4oeCkKfQoKYGBgCgphcHBseSBpdCB0byB0aGUgc2ltdWxhdGVkIHJhdGluZyBmcmFtZXMuCgoodW5oYXNoIHRvIHJ1biB0aGlzKQoKYGBge3J9CiMjIGluaXRpYWxpc2UgZGF0YWZyYW1lcwojIAojIGVzdF9wbHVzX3NjYWxlZCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPWRpbShyYXRpbmdfZXN0X3BsdXMpWzJdLG5yb3cgPSBkaW0ocmF0aW5nX2VzdF9wbHVzKVsxXSkpCiMgZXN0X21pbnVzX3NjYWxlZCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPWRpbShyYXRpbmdfZXN0X21pbnVzKVsyXSxucm93ID0gZGltKHJhdGluZ19lc3RfbWludXMpWzFdKSkKIyAKIyAjIyAgcG9wdWxhdGUgd2l0aCByZXNjYWxlZCB2YWx1ZXMKIyAKIyBmb3IgKHN1YiBpbiAxOmRpbShyYXRpbmdfZXN0X3BsdXMpWzFdKXsKIyAgIGZvciAoY29sIGluIDE6ZGltKHJhdGluZ19lc3RfcGx1cylbMl0pewojICAgICAKIyAgICAgZXN0X3BsdXNfc2NhbGVkW3N1Yixjb2xdIDwtIHNjYWxlX3NpbXVsYXRlZChyYXRpbmdfZXN0X3BsdXNbc3ViLGNvbF0pCiMgICB9CiMgfQojIAojIGZvciAoc3ViIGluIDE6ZGltKHJhdGluZ19lc3RfbWludXMpWzFdKXsKIyAgIGZvciAoY29sIGluIDE6ZGltKHJhdGluZ19lc3RfbWludXMpWzJdKXsKIyAgICAgCiMgICAgIGVzdF9taW51c19zY2FsZWRbc3ViLGNvbF0gPC0gc2NhbGVfc2ltdWxhdGVkKHJhdGluZ19lc3RfbWludXNbc3ViLGNvbF0pCiMgICB9CiMgfQoKCmBgYAoKIyMjIyBDb3JyZWxhdGUgYWN0dWFsIHJhdGluZ3Mgd2l0aCBzaW11bGF0ZWQgcmF0aW5ncwoKdXNlIHRoZSBzaW11bGF0ZWQgcmF0aW5ncyBwZXIgcGVyc29uIHRoYXQgd2UgaGF2ZSBkZXJpdmVkIHVzaW5nIG91ciBwYXJhbXRlcnMgYW5kIHNlZSBob3cgd2VsbCB0aGV5IGFsaWduIHdpdGggdGhlIHJlYWwgcmF0aW5ncy4uLgoKT25seSBzaG93aW5nIHRoZSBkaWFnYW5vbHMgZnJvbSBjb3JyLnRlc3QgcGFja2FnZSBoZXJlIHRvIGdldCB0aGUgaW1wb3J0YW50IHQxIHggdDEgZXRjIHZhbHVlcy4KCnRoaXMgd2lsbCBiZSB1c2luZyBlaXRoZXIgcmF0aW5nX2VzdCBmaWxlcyAocmF0aW5nX2VzdF9wbHVzO3JhdGluZ19lc3RfbWludXMpIG9yIHRoZSBlc3Rfc2NhbGVkIGZpbGVzIChlc3RfbWludXNfc2NhbGVkOyBlc3RfcGx1c19zY2FsZWQpIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIG9wdCB0byByZXR1cm4gc2NhbGluZyBvciBubyAKCmBgYHtyfQoKcHJpbnQoInJlYWwgcmF0aW5ncyB3aXRoIGVzdGltYXRlZCByYXRpbmdzOiBDUyBNSU5VUyIpCmRpYWcoY29yci50ZXN0KHJhdGluZ19lc3RfbWludXMsbWludXNfc2NhbGVkKSRyKQoKcHJpbnQoInJlYWwgcmF0aW5ncyB3aXRoIGVzdGltYXRlZCByYXRpbmdzOiBDUyBNSU5VUyAoYXZlcmFnZSBmb3IgYWxsIHRyaWFscykiKQpjb3Iocm93TWVhbnMocmF0aW5nX2VzdF9taW51cykscm93TWVhbnMobWludXNfc2NhbGVkKSkKCgpwcmludCgicmVhbCByYXRpbmdzIHdpdGggZXN0aW1hdGVkIHJhdGluZ3M6IENTIFBMVVMiKQpkaWFnKGNvcnIudGVzdChyYXRpbmdfZXN0X3BsdXMscGx1c19zY2FsZWQpJHIpCgpwcmludCgicmVhbCByYXRpbmdzIHdpdGggZXN0aW1hdGVkIHJhdGluZ3M6IENTIFBMVVMgKGF2ZXJhZ2UgZm9yIGFsbCB0cmlhbHMpIikKY29yKHJvd01lYW5zKHJhdGluZ19lc3RfcGx1cykscm93TWVhbnMocGx1c19zY2FsZWQpKQoKYGBgCgojIyMgUmVjb3ZlcgoKSGVyZSB3ZSBhcmUgc2VlaW5nIGlmIHdlIGNhbiByZWNvdmVyIHRoZSBzYW1lIGVzdGltYXRlcyB1c2luZyB0aGUgc2ltdWxhdGVkIHJhdGluZ3MuIEJhc2ljYWxseSBydW4gc3RhbiBidXQgdXNpbmcgdGhlIGVzdGltYXRlZCByYXRpbmdzIGluc3RlYWQgb2YgdGhlIHJlYWwgb25lcy4gU2VlIGlmIHdlIGdldCB0aGUgc2FtZSBhbHBoYSAvIGJldGEgcGFyYW10ZXJzLgoKV2UgbWlnaHQgZGVjaWRlIHRvIHVzZSB0aGUgcmVzY2FsZWQgZXN0aW1hdGVzIGhlcmUgdG8gYmUgbW9yZSBjb21wYXJhYmxlLi4uCgojIyMjIHJ1biBzdGFuIG1vZGVsCgpSTCBtb2RlbCBhZGRpbmcgYSBiZXRhIHBlciBzdGltdWx1cyB0byBBbGV4J3MgbW9kZWwKCmBgYHtyfQojIyBkZWNpZGUgdGVzdGluZyByYXRlIChtaW4sbWVkLG1heCBvciBvZmYpCnRlc3RpbmcoJ21pbicpCgojIyBzZXQgdXAgcnVuCnN0YW5uYW1lPSdiZXRhX21lYW5zZF9STF80LnN0YW4nCgpzdGFuZmlsZSA8LSBmaWxlLnBhdGgoc2NyaXB0ZGlyLCBzdGFubmFtZSkKCmZsYXJlX2RhdGE8LWxpc3QobnRyaWFscz1udHJpYWxzLG5zdWI9bnN1YixzY3JlYW1QbHVzID0gdChzY3JlYW1QbHVzKSwgc2NyZWFtTWludXM9IHQoc2NyZWFtTWludXMpLHJhdGluZ3NQbHVzPXQocmF0aW5nX2VzdF9wbHVzKSxyYXRpbmdzTWludXM9dChyYXRpbmdfZXN0X21pbnVzKSxjZGZfc2NhbGU9Y2RmX3NjYWxlKQoKZmxhcmVfZml0X3JlYyA8LSBzdGFuKGZpbGUgPSBzdGFuZmlsZSwgZGF0YSA9IGZsYXJlX2RhdGEsIGl0ZXI9Y2hhaW5faXRlcix3YXJtdXAgPSB3YXJtX3VwLCBjaGFpbnMgPSBjaGFpbl9uKSAjYWRkIHdvcmtpbmcgZGlyPwoKc2F2ZShmbGFyZV9maXRfcmVjLCBmaWxlPWZpbGUucGF0aChkYXRhZGlyLCdmbGFyZV9maXRfMmJldGFNZWFuJykpCgp0cmFjZXBsb3QoZmxhcmVfZml0X2Jlc3QsJ2xwX18nKQoKIyBleHRyYWN0IGZpdCBkYXRhCnN1bW1hcnlfZmxhcmUgPC0gc3VtbWFyeShmbGFyZV9maXRfcmVjKQoKYGBgCgojIyMjIE1ha2UgYWxwaGEgLyBiZXRhIGRhdGFzZXRzIHAvcAoKVXNlIHRoZSBzdW1tYXJ5IG9mIHRoZSBzdGFuIG1vZGVsIHRvIGV4dHJhY3QgdGhlIGRpZmZlcmVudCBwYXJhbXRlcnMgd2Ugd2FudCB0byB0cnkgdG8gdXNlIHRvIHJlY3JlYXRlIG91ciBkYXRhLgoKYGBge3J9CgpwYXJhbXNfcmVjIDwtIHN1bW1hcnkoZmxhcmVfZml0X3JlYykKYWxwaGFfZXN0X3JlYyA8LSBkYXRhLmZyYW1lKHBhcmFtc19yZWMkc3VtbWFyeVsxOjM0MiwxXSkKYmV0YV9yZWMgPC0gZGF0YS5mcmFtZShwYXJhbXNfcmVjJHN1bW1hcnlbMzQzOjY4NV0pCgpuYW1lcyhiZXRhX3JlYykgPC0gImJldGFfcmVjIgoKCgpgYGAKCiMjIyMgQ29ycmVsYXRlIGFjdHVhbCByYXRpbmdzIHdpdGggc2ltdWxhdGVkIHJhdGluZ3MKCnVzZSB0aGUgc2ltdWxhdGVkIHJhdGluZ3MgcGVyIHBlcnNvbiB0aGF0IHdlIGhhdmUgZGVyaXZlZCB1c2luZyBvdXIgcGFyYW10ZXJzIGFuZCBzZWUgaG93IHdlbGwgdGhleSBhbGlnbiB3aXRoIHRoZSByZWFsIHJhdGluZ3MuLi4KCk9ubHkgc2hvd2luZyB0aGUgZGlhZ2Fub2xzIGZyb20gY29yci50ZXN0IHBhY2thZ2UgaGVyZSB0byBnZXQgdGhlIGltcG9ydGFudCB0MSB4IHQxIGV0YyB2YWx1ZXMuCgpgYGB7cn0KCnByaW50KCJvcmlnaW5hbCB3aXRoIHJlY292ZXJlZDogQUxQSEEiKQpkaWFnKGNvcnIudGVzdChhbHBoYV9lc3RfcmVjLGFscGhhX2VzdCkkcikKCnByaW50KCJvcmlnaW5hbCB3aXRoIHJlY292ZXJlZDogQkVUQSIpCmRpYWcoY29yci50ZXN0KGJldGFfcmVjLGJldGEpJHIpCgoKCmBgYAoKCiMjIE1lYW4gMiBiZXRhCiMjIyBHZW5lcmF0ZSAKIyMjIyMgTWFrZSBhbHBoYSAvIGJldGEgZGF0YXNldHMgcC9wCgpVc2UgdGhlIHN1bW1hcnkgb2YgdGhlIHN0YW4gbW9kZWwgdG8gZXh0cmFjdCB0aGUgZGlmZmVyZW50IHBhcmFtdGVycyB3ZSB3YW50IHRvIHRyeSB0byB1c2UgdG8gcmVjcmVhdGUgb3VyIGRhdGEuCgpgYGB7cn0KCnBhcmFtcyA8LSBzdW1tYXJ5KGZsYXJlX2ZpdF9tMikKYWxwaGFfZXN0IDwtIGRhdGEuZnJhbWUocGFyYW1zJHN1bW1hcnlbMTozNDIsMV0pCmJldGFfcGx1cyA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gMSxucm93PTM0MikpCmJldGFfbWludXMgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDEsbnJvdz0zNDIpKQoKbmFtZXMoYmV0YV9wbHVzKSA8LSAiYmV0YV9wbHVzIgpuYW1lcyhiZXRhX21pbnVzKSA8LSAiYmV0YV9taW51cyIKICAKc3VicCA9IDAKc3VibSA9IDAKICBmb3IgKCBpIGluIDM0MzoxMDI2KXsKICAgIAogICAgaWYgKGklJTIgPT0gMSl7CiAgICAgIHN1YnA9IHN1YnArMQogICAgICBiZXRhX3BsdXNbc3VicCwxXSA8LSBwYXJhbXMkc3VtbWFyeVtpLDFdCiAgICB9IGVsc2UgaWYgKGklJTIgPT0gMCkgewogICAgICBzdWJtPSBzdWJtKzEKICAgICAgYmV0YV9taW51c1tzdWJtLDFdIDwtIHBhcmFtcyRzdW1tYXJ5W2ksMV0gCiAgICB9CiAgICAKfQoKCmBgYAoKIyMjIyMgSW5pdGlhbGlzZSBlbXB0eSBkYXRhc2V0cyB0byBob2xkIHRoZSBwcmVkaWN0ZWQgcmF0aW5ncwoKYGBge3J9CgpyYXRpbmdfZXN0X3BsdXMgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCnJhdGluZ19lc3RfbWludXMgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCgojIGJldGEgc2hhcGUgcGFyYW10ZXJzCnNoYXBlMXAgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCnNoYXBlMW0gPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCnNoYXBlMnAgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCnNoYXBlMm0gPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCgojIFYgcGFyYW1ldGVycyAoaW5pdGlhbGlzZWQgYXQgMC41KQp2cCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPW50cmlhbHMsbnJvdz1uc3ViKSkKdm0gPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbD1udHJpYWxzLG5yb3c9bnN1YikpCgp2cFsxXSA8LSAwLjUKdm1bMV0gPC0gMC41CgojIHByZWRpY3Rpb24gZXJyb3IgCgpkcCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPShudHJpYWxzLTEpLG5yb3c9bnN1YikpIApkbSA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPShudHJpYWxzLTEpLG5yb3c9bnN1YikpIAoKICAKYGBgCgojIyMjIyBTaW11bGF0ZSByYXRpbmdzCgpVc2Ugb3VyIGV4dHJhY3RlZCBwYXJhbXRlcnMgaW4gcGxhY2Ugb2YgZXN0aW1hdGluZyB0aGUgc2FtZS4gVXNlIHRoZSBzdGFuIHN5bnRheAoKCiMjIyMjIyAgUG9wdWxhdGUgb3VyIHZwbHVzIGFuZCBkZWx0YSBmcmFtZXMKCnVzZSB0aGUgYWxwaGEgcGFyYW10ZXJzIHdlJ3ZlIGV4dHJhY3RlZCAoYWxwaGFfZXN0KQpkID09IGRlbHRhIChwcmVjZGljdGlvbiBlcnJvcikKdiA9PSB2YWx1ZSAoaS5lLiB2YWx1ZSBmb3IgZWFjaCBzdGltdWx1cykKCgpgYGB7cn0KCmZvciAocCBpbiAxOm5zdWIpewogIGZvciAodCBpbiAxOihudHJpYWxzLTEpKXsKICAgICAgZHBbcCx0XSA8LSBzY3JlYW1QbHVzW3AsdF0tdnBbcCx0XQogICAgICBkbVtwLHRdIDwtIHNjcmVhbU1pbnVzW3AsdF0tdm1bcCx0XQogICAgICB2cFtwLHQrMV0gPC0gdnBbcCx0XSthbHBoYV9lc3RbcCwxXSpkcFtwLHRdCiAgICAgIHZtW3AsdCsxXTwtIHZtW3AsdF0rYWxwaGFfZXN0W3AsMV0qZHBbcCx0XQogICAgfQp9CgpgYGAKCiAgICBmb3IgKHQgaW4gMTpudHJpYWxzKXsKICAgICAgc2hhcGUxX1BsdXNbdCxwXSA9IFZQbHVzW3QscF0gKiAoKFZQbHVzW3QscF0gKiAoMS1WUGx1c1t0LHBdKSkgLyBiZXRhW3AsMV0pOwogICAgICBzaGFwZTFfTWludXNbdCxwXSA9IFZNaW51c1t0LHBdICogKChWTWludXNbdCxwXSAqICgxLVZNaW51c1t0LHBdKSkgLyBiZXRhW3AsMl0pOwogICAgICBzaGFwZTJfUGx1c1t0LHBdID0gKDEtVlBsdXNbdCxwXSkgKiAoKFZQbHVzW3QscF0gKiAoMS1WUGx1c1t0LHBdKSkgLyBiZXRhW3AsMV0pOwogICAgICBzaGFwZTJfTWludXNbdCxwXSA9ICgxLVZNaW51c1t0LHBdKSAqICgoVk1pbnVzW3QscF0gKiAoMS1WTWludXNbdCxwXSkpIC8gYmV0YVtwLDJdKTsKCiAgICAgIHJhdGluZ3NQbHVzW3QscF0gfiBiZXRhKHNoYXBlMV9QbHVzW3QscF0sc2hhcGUyX1BsdXNbdCxwXSk7CiAgICAgIHJhdGluZ3NNaW51c1t0LHBdIH4gYmV0YShzaGFwZTFfTWludXNbdCxwXSxzaGFwZTJfTWludXNbdCxwXSk7CiAgICB9CiAgfQp9CgoKIyMjIyMjIHBvcHVsYXRlIGJldGEgcGFyYW10ZXIgc2hhcGUgZnJhbWVzCgpVc2UgdGhlIG5ldyB2IGZyYW1lcyBhbmQgYmV0YSBwYXJhbWV0ZXJzLgoKU2hhcGUgMSBhbmQgMiBhcmUgc3VmZmljaWVudCBwYXJhbXRlcnMgZm9yIHRoZSBiZXRhIGRpc3RyaWJ1dGlvbgoKYGBge3J9Cgpmb3IgKHAgaW4gMTpuc3ViKXsKICAKICBmb3IgKHQgaW4gMTpudHJpYWxzKXsKICAgIAogICAgICBzaGFwZTFwW3AsdF0gPSB2cFtwLHRdICogKCh2cFtwLHRdICogKDEtdnBbcCx0XSkpIC8gYmV0YV9wbHVzW3AsMV0pCiAgICAgIHNoYXBlMW1bcCx0XSA9IHZtW3AsdF0gKiAoKHZtW3AsdF0gKiAoMS12bVtwLHRdKSkgLyBiZXRhX21pbnVzW3AsMV0pCiAgICAgIHNoYXBlMnBbcCx0XSA9ICgxLXZwW3AsdF0pICogKCh2cFtwLHRdICogKDEtdnBbcCx0XSkpIC8gYmV0YV9wbHVzW3AsMV0pCiAgICAgIHNoYXBlMm1bcCx0XSA9ICgxLXZtW3AsdF0pICogKCh2bVtwLHRdICogKDEtdm1bcCx0XSkpIC8gYmV0YV9taW51c1twLDFdKQogICAgICAKICB9Cn0KICAKCmBgYAoKCiMjIyMjIyBFc3RpbWF0ZSByYXRpbmdzCgoKdHJ5aW5nIHRvIHVzZSBwYmV0YSBoZXJlIChkZXJpdmVzIHRoZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gZ2l2ZW1uIGEgc2V0IG9mIHByb2JhYmlsaXRpZXMpIAoKRm9yIG5vdywgc2V0dGluZyBwcm9iYWJpbGl0aWVzIGJldHdlZW4gMCBhbmQgMSBhbmQgdGFraW5nIHRoZSBhdmVyYWdlLi4uCmBgYHtyfQoKCmZvciAocCBpbiAxOm5zdWIpewogIAogIGZvciAodCBpbiAxOm50cmlhbHMpewogICAgCiAgICByYXRpbmdfZXN0X3BsdXNbcCx0XSA8LSBtZWFuKHJiZXRhKDEwMDAsc2hhcGUxcFtwLHRdLHNoYXBlMnBbcCx0XSkpCiAgICByYXRpbmdfZXN0X21pbnVzW3AsdF0gPC0gbWVhbihyYmV0YSgxMDAwLHNoYXBlMW1bcCx0XSxzaGFwZTJtW3AsdF0pKQogICAgCiAgfQp9CgoKYGBgCgojIyMjIENvcnJlbGF0ZSBhY3R1YWwgcmF0aW5ncyB3aXRoIHNpbXVsYXRlZCByYXRpbmdzCgp1c2UgdGhlIHNpbXVsYXRlZCByYXRpbmdzIHBlciBwZXJzb24gdGhhdCB3ZSBoYXZlIGRlcml2ZWQgdXNpbmcgb3VyIHBhcmFtdGVycyBhbmQgc2VlIGhvdyB3ZWxsIHRoZXkgYWxpZ24gd2l0aCB0aGUgcmVhbCByYXRpbmdzLi4uCgpPbmx5IHNob3dpbmcgdGhlIGRpYWdhbm9scyBmcm9tIGNvcnIudGVzdCBwYWNrYWdlIGhlcmUgdG8gZ2V0IHRoZSBpbXBvcnRhbnQgdDEgeCB0MSBldGMgdmFsdWVzLgoKYGBge3J9CgpwcmludCgicmVhbCByYXRpbmdzIHdpdGggZXN0aW1hdGVkIHJhdGluZ3M6IENTIE1JTlVTIikKZGlhZyhjb3JyLnRlc3Qocm93TWVhbnMocmF0aW5nX2VzdF9taW51cykscm93TWVhbnMobWludXNfc2NhbGVkKSkkcikKCnByaW50KCJyZWFsIHJhdGluZ3Mgd2l0aCBlc3RpbWF0ZWQgcmF0aW5nczogQ1MgTUlOVVMgKGF2ZXJhZ2UgZm9yIGFsbCB0cmlhbHMpIikKY29yKHJvd01lYW5zKHJhdGluZ19lc3RfbWludXMpLHJvd01lYW5zKG1pbnVzX3NjYWxlZCkpCgoKcHJpbnQoInJlYWwgcmF0aW5ncyB3aXRoIGVzdGltYXRlZCByYXRpbmdzOiBDUyBQTFVTIikKZGlhZyhjb3JyLnRlc3QocmF0aW5nX2VzdF9wbHVzLHBsdXNfc2NhbGVkKSRyKQoKcHJpbnQoInJlYWwgcmF0aW5ncyB3aXRoIGVzdGltYXRlZCByYXRpbmdzOiBDUyBQTFVTIChhdmVyYWdlIGZvciBhbGwgdHJpYWxzKSIpCmNvcihyb3dNZWFucyhyYXRpbmdfZXN0X3BsdXMpLHJvd01lYW5zKHBsdXNfc2NhbGVkKSkKCgpgYGAKCiMjIyBSZWNvdmVyCgpIZXJlIHdlIGFyZSBzZWVpbmcgaWYgd2UgY2FuIHJlY292ZXIgdGhlIHNhbWUgZXN0aW1hdGVzIHVzaW5nIHRoZSBzaW11bGF0ZWQgcmF0aW5ncy4gQmFzaWNhbGx5IHJ1biBzdGFuIGJ1dCB1c2luZyB0aGUgZXN0aW1hdGVkIHJhdGluZ3MgaW5zdGVhZCBvZiB0aGUgcmVhbCBvbmVzLiBTZWUgaWYgd2UgZ2V0IHRoZSBzYW1lIGFscGhhIC8gYmV0YSBwYXJhbXRlcnMuCgojIyMjIHJlc2NhbGUgdGhlIGVzdGltYXRlZCByYXRpbmdzCgoKcmVzY2FsZSB0aGUgMS05IGV4cGVjdGFuY3kgdmFsdWVzIHRvIGJlIG9uIGEgMC0xIHNjYWxlLgoKc3RhbiBjYW5ub3QgZGVhbCB3aXRoIHRoZSBleHRyZW1lIGxpbWl0IG9mIHRoZSBiZXRhLCBzbyBtYWtlIHRoZSByZXNjYWxlZCBsaW1pdHMganVzdCBhYm92ZSAwIGFuZCBiZWxvdyBvbmUKCk5vdGUgdGhhdCB3aGVuIGEgdmFsdWUgaGFkIHRvIGJlIGltcHV0ZWQgYXMgaXQgd2FzIG1pc3NpbmcgaXQgd2lsbCBub3QgYmUgYW4gaW50ZWdlci4gVGh1cyB0aGUgZnVuY3Rpb24gbmVlZHMgdG8gYWxsb3cgZm9yIHJhbmdlcyBiZXR3ZWVuIHZhbHVlcy4KCmBgYHtyfQoKbWludXNfc2NhbGVkX2VzdCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPWRpbShyYXRpbmdfZXN0X21pbnVzKVsyXSxucm93ID0gZGltKHJhdGluZ19lc3RfbWludXMpWzFdKSkKCiMjICBwb3B1bGF0ZSB3aXRoIHJleGNhbGVkIHZhbHVlcwoKZm9yIChzdWIgaW4gMTpkaW0ocmF0aW5nX2VzdF9taW51cylbMV0pewogIGZvciAoY29sIGluIDE6ZGltKHJhdGluZ19lc3RfbWludXMpWzJdKXsKICAgIAogICAgbWludXNfc2NhbGVkX2VzdFtzdWIsY29sXSA8LSBzY2FsZV9mbGFyZShyYXRpbmdfZXN0X21pbnVzW3N1Yixjb2xdKQogIH0KfQoKIyMgZGl0dG8gZm9yIHBsdXMKCnBsdXNfc2NhbGVkX2VzdCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPWRpbShyYXRpbmdfZXN0X3BsdXMpWzJdLG5yb3cgPSBkaW0ocmF0aW5nX2VzdF9wbHVzKVsxXSkpCgojIyAgcG9wdWxhdGUgd2l0aCByZXhjYWxlZCB2YWx1ZXMKCmZvciAoc3ViIGluIDE6ZGltKHJhdGluZ19lc3RfcGx1cylbMV0pewogIGZvciAoY29sIGluIDE6ZGltKHJhdGluZ19lc3RfcGx1cylbMl0pewogICAgCiAgICBwbHVzX3NjYWxlZF9lc3Rbc3ViLGNvbF0gPC0gc2NhbGVfZmxhcmUocmF0aW5nX2VzdF9wbHVzW3N1Yixjb2xdKQogIH0KfQoKCgpgYGAKCiMjIyMgcnVuIHN0YW4gbW9kZWwKCgpSTCBtb2RlbCBhZGRpbmcgYSBiZXRhIHBlciBzdGltdWx1cyB0byBBbGV4J3MgbW9kZWwKCmBgYHtyfQojIyBkZWNpZGUgdGVzdGluZyByYXRlIChtaW4sbWVkLG1heCBvciBvZmYpCnRlc3RpbmcoJ21pbicpCgojIyBzZXQgdXAgcnVuCnN0YW5uYW1lPSdiZXRhX21lYW5zZF8yYmV0YV9STC5zdGFuJwoKc3RhbmZpbGUgPC0gZmlsZS5wYXRoKHNjcmlwdGRpciwgc3Rhbm5hbWUpCgpmbGFyZV9kYXRhPC1saXN0KG50cmlhbHM9bnRyaWFscyxuc3ViPW5zdWIsc2NyZWFtUGx1cyA9IHQoc2NyZWFtUGx1cyksIHNjcmVhbU1pbnVzPSB0KHNjcmVhbU1pbnVzKSxyYXRpbmdzUGx1cz10KHBsdXNfc2NhbGVkX2VzdCkscmF0aW5nc01pbnVzPXQobWludXNfc2NhbGVkX2VzdCksY2RmX3NjYWxlPWNkZl9zY2FsZSkKCmZsYXJlX2ZpdF9yZWMgPC0gc3RhbihmaWxlID0gc3RhbmZpbGUsIGRhdGEgPSBmbGFyZV9kYXRhLCBpdGVyPWNoYWluX2l0ZXIsd2FybXVwID0gd2FybV91cCwgY2hhaW5zID0gY2hhaW5fbikgI2FkZCB3b3JraW5nIGRpcj8KCnNhdmUoZmxhcmVfZml0X3JlYywgZmlsZT1maWxlLnBhdGgoZGF0YWRpciwnZmxhcmVfZml0XzJiZXRhTWVhbicpKQoKdHJhY2VwbG90KGZsYXJlX2ZpdF9iZXN0LCdscF9fJykKCiMgZXh0cmFjdCBmaXQgZGF0YQpzdW1tYXJ5X2ZsYXJlIDwtIHN1bW1hcnkoZmxhcmVfZml0X3JlYykKCmBgYAoKIyMjIyBNYWtlIGFscGhhIC8gYmV0YSBkYXRhc2V0cyBwL3AKClVzZSB0aGUgc3VtbWFyeSBvZiB0aGUgc3RhbiBtb2RlbCB0byBleHRyYWN0IHRoZSBkaWZmZXJlbnQgcGFyYW10ZXJzIHdlIHdhbnQgdG8gdHJ5IHRvIHVzZSB0byByZWNyZWF0ZSBvdXIgZGF0YS4KCmBgYHtyfQoKcGFyYW1zX3JlYyA8LSBzdW1tYXJ5KGZsYXJlX2ZpdF9yZWMpCmFscGhhX2VzdF9yZWMgPC0gZGF0YS5mcmFtZShwYXJhbXNfcmVjJHN1bW1hcnlbMTozNDIsMV0pCmJldGFfcGx1c19yZWMgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDEsbnJvdz0zNDIpKQpiZXRhX21pbnVzX3JlYyA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gMSxucm93PTM0MikpCgpuYW1lcyhiZXRhX3BsdXNfcmVjKSA8LSAiYmV0YV9wbHVzIgpuYW1lcyhiZXRhX21pbnVzX3JlYykgPC0gImJldGFfbWludXMiCiAgCnN1YnAgPSAwCnN1Ym0gPSAwCiAgZm9yICggaSBpbiAzNDM6MTAyNil7CiAgICAKICAgIGlmIChpJSUyID09IDEpewogICAgICBzdWJwPSBzdWJwKzEKICAgICAgYmV0YV9wbHVzX3JlY1tzdWJwLDFdIDwtIHBhcmFtc19yZWMkc3VtbWFyeVtpLDFdCiAgICB9IGVsc2UgaWYgKGklJTIgPT0gMCkgewogICAgICBzdWJtPSBzdWJtKzEKICAgICAgYmV0YV9taW51c19yZWNbc3VibSwxXSA8LSBwYXJhbXNfcmVjJHN1bW1hcnlbaSwxXSAKICAgIH0KICAgIAp9CgoKYGBgCgojIyMjIENvcnJlbGF0ZSBhY3R1YWwgcmF0aW5ncyB3aXRoIHNpbXVsYXRlZCByYXRpbmdzCgp1c2UgdGhlIHNpbXVsYXRlZCByYXRpbmdzIHBlciBwZXJzb24gdGhhdCB3ZSBoYXZlIGRlcml2ZWQgdXNpbmcgb3VyIHBhcmFtdGVycyBhbmQgc2VlIGhvdyB3ZWxsIHRoZXkgYWxpZ24gd2l0aCB0aGUgcmVhbCByYXRpbmdzLi4uCgpPbmx5IHNob3dpbmcgdGhlIGRpYWdhbm9scyBmcm9tIGNvcnIudGVzdCBwYWNrYWdlIGhlcmUgdG8gZ2V0IHRoZSBpbXBvcnRhbnQgdDEgeCB0MSBldGMgdmFsdWVzLgoKYGBge3J9CgpwcmludCgib3JpZ2luYWwgd2l0aCByZWNvdmVyZWQ6IEFMUEhBIikKZGlhZyhjb3JyLnRlc3QoYWxwaGFfZXN0X3JlYyxhbHBoYV9lc3QpJHIpCgpwcmludCgib3JpZ2luYWwgd2l0aCByZWNvdmVyZWQ6IEJFVEEgUExVUyIpCmRpYWcoY29yci50ZXN0KGJldGFfcGx1c19yZWMsYmV0YV9wbHVzKSRyKQoKcHJpbnQoIm9yaWdpbmFsIHdpdGggcmVjb3ZlcmVkOiBCRVRBIE1JTlVTIikKZGlhZyhjb3JyLnRlc3QoYmV0YV9taW51c19yZWMsYmV0YV9taW51cykkcikKCmBgYAoKCiMgRXhwYW5kaW5nIG9uIHRoZSBiZXN0IGJhc2UgbW9kZWwKCgojIFBvdGVudGlhbGx5IGludGVyZXN0aW5nIHBhcmFtdGVycyB0byBhZGQgdG8gYmVzdCBmaXQgbW9kZWwKCiMjIE1vZGVsIDg6IFB1bmlzaG1lbnQgc2Vuc2l0aXZpdHkgCgpIb3cgYXZlcnNpdmUgdGhleSBmaW5kIHRoZSBzY3JlYW0gcmVpbmZvcmNlbWVudC4gTW9kZWxsaW5nIHRoaXMgb24gdGhlIGxvc3MgYXZlcnNpb24gcGFyYW10ZXIgaW4gW0NoYXJwZW50aWVyIGV0IGFsXShodHRwczovL2YxMDAwLmNvbS93b3JrL2l0ZW0vNjcwNzEzNC9yZXNvdXJjZXMvNTg2NDc3NC9wZGYpIChzZWUgdGhlIGxhc3QgcGFnZSBiZWZvcmUgcmVmZXJlbmNlcyksCgpUaGlzIHdpbGwgYmUgYSBzaW5nbGUgcGFyYW1ldGVyIHBlciBwZXJzb24sIGFuZCByZXByZXNlbnRzIGhvdyBtdWNoIHRoZSBzY3JlYW0gaW5mbHVlbmNlcyB0aGVpciByYXRpbmdzLiAKCkJhc2VkIG9uIHRoZSBwYXBlciwgd2lsbCB0cnkgdGhlIGZvbGxvd2luZyB0byBtb2RlbCB0aGlzIGluIHN0YW4gYnkgaW5jbHVkaW5nIGl0IGluIG91ciB2YWx1ZSBjYWxjcyBmb3IgdGhlIENTKyBhbmQgQ1MtIHJlc3BlY3RpdmVseS4gd2Ugd2lsbCBkbyB0aGlzIGJ5IGxldHRpbmcgaXQgaW5mbHVlbmNlIGhvdyBtdWNoIHRoZWlyIHByZWRpY3Rpb24gZXJyb3IgY2hhbmdlcyBiYXNlZCBvbiB3aGV0aGVyIGEgc2NyZWFtIG9jY3VycmVkIG9yIG5vdC4gVGhlIHByZWRpY3Rpb24gZXJyb3IgaXMgbGF0ZXIgdXNlZCB0byBjaGFuZ2UgdGhlIHZhbHVlIHJhdGluZyBwZXIgc3RpbXVsdXMKCgokJGQoc3RpbXVsdXMsdHJpYWwpID0gc2NyZWFtKlxsYW1iZGEtdihzdGltdWx1cyx0cmlhbC0xKSQkCgp3aGVyZSAkJFxsYW1iZGEgPSBzZW5zaXRpdml0eVxcdG9cXHNjcmVhbXMkJCAKCgoKYGBge3J9CgojIyBkZWNpZGUgdGVzdGluZyByYXRlIChtaW4sbWVkLG1heCBvciBvZmYpCnRlc3RpbmcoJ21pbicpCgojIyBzZXQgdXAgcnVuCnN0YW5uYW1lPSdiZXRhX21lYW4xYmV0YV9QdW5TZW5zLnN0YW4nCgpzdGFuZmlsZSA8LSBmaWxlLnBhdGgoc2NyaXB0ZGlyLCBzdGFubmFtZSkKCmZsYXJlX2RhdGE8LWxpc3QobnRyaWFscz1udHJpYWxzLG5zdWI9bnN1YixzY3JlYW1QbHVzID0gdChzY3JlYW1QbHVzKSwgc2NyZWFtTWludXM9IHQoc2NyZWFtTWludXMpLHJhdGluZ3NQbHVzPXQocGx1c19zY2FsZWQpLHJhdGluZ3NNaW51cz10KG1pbnVzX3NjYWxlZCkpCgpmbGFyZV9maXQgPC0gc3RhbihmaWxlID0gc3RhbmZpbGUsIGRhdGEgPSBmbGFyZV9kYXRhLCBpdGVyPWNoYWluX2l0ZXIsIGNoYWlucyA9IGNoYWluX24pICNhZGQgd29ya2luZyBkaXI/CgpzYXZlKGZsYXJlX2ZpdCwgZmlsZT1maWxlLnBhdGgoZGF0YWRpciwnZmxhcmVfZml0X3Rlc3QnKSkKCnRyYWNlcGxvdChmbGFyZV9maXQsJ2xwX18nKQoKIyBleHRyYWN0IGZpdCBkYXRhCnN1bW1hcnlfZmxhcmUgPC0gc3VtbWFyeShmbGFyZV9maXQpCgojIGV4dHJhY3QgbW9kZWwgc3VtbWFyeSBkYXRhCgojZmxhcmVfbG9nbGlrZTwtIGV4dHJhY3RfbG9nX2xpayhmbGFyZV9maXQsIHBhcmFtZXRlcl9uYW1lID0gImxvZ2xpayIsIG1lcmdlX2NoYWlucyA9IFRSVUUpCgoKYGBgCgpgYGB7cn0KIyMgZ2V0IHNvbWUgYmFzaWMgb3V0cHV0IGRlc2NyaXB0aW9ucyBwcmludGVkIHRvIHNjcmVlbgoKb3V0X2Rlc2NyaWJlKHN1bW1hcnlfZmxhcmUpCgpgYGAKCgoKCiMjIyMgQ3JlYXRlIEJJQyBmcm9tIGxvZyBsaWtlbGlob29kCgpgYGB7cn0KIyMgZXh0cmFjdCBsb2cgbGlrZWxpaG9vZAoKZmxhcmVfbG9nbGlrZSA8LSBleHRyYWN0X2xvZ19saWsoZmxhcmVfZml0LCBwYXJhbWV0ZXJfbmFtZSA9ICJsb2dsaWsiLCBtZXJnZV9jaGFpbnMgPSBUUlVFKQoKI2NhbGN1bGF0ZSBCSUMKCkZMQVJlX2JpYzwtYmljKG50cmlhbHMsLWNvbE1lYW5zKGZsYXJlX2xvZ2xpa2UpLDIpICNudW1iZXIgb2YgcGFyYW1ldGVycyBpbiB0aGF0IG1vZGVsIGUuZy4gNCkKCiMjIG1lYW4gQklDIGFzIG1vZGVsIGNvbXBhcmlzb25zIHRvb2w6CgpwcmludCgiTWVhbiBCYXllc2lhbiBpbmZvcm1hdGlvbiBjcml0ZXJpb24gZm9yIG1vZGVsIikKbWVhbihGTEFSZV9iaWMpCgpgYGAKCiMjIyMgQWRkIHRvIGJhciBwbG90CgpgYGB7cn0KCm1vZF9jb21wIDwtIHJiaW5kKG5hLm9taXQobW9kX2NvbXApLGMoIlB1bmlzaG1lbnQgc2Vuc2l0aXZpdHkiLG1lYW4oRkxBUmVfYmljKSkpCgpwbG90IDwtIGdncGxvdChtb2RfY29tcCxhZXMoeD1tb2RlbCx5PUJJQykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGNvb3JkX2ZsaXAoKQoKc2hvdyhwbG90KQoKYGBgCgojIyMgR2VuZXJhdGUKCiMjIyBSZWNvdmVyCgoKIyMgUmF0aW5nIGNvbnNpc3RlbmN5CgpBIHBhcmFtZXRlciB0aGF0IHJlcHJlc2VudHMgdGhlIHJhdGluZyBjb25zaXN0ZW5jeSBmb3IgbXVsdGlwbGUgcmVwZWF0ZWQgLyBzaW1pbGFyIHRyaWFscy4gSSB0aGluayBpdCB3b3VsZCBiZSBiZXN0IHRvIGhhdmUgb25lIGVhY2ggZm9yIHRoZSBDUysgYW5kIENTLSBnaXZlbiB0aGVzZSBkaWZmZXIgaW4gdGVybXMgb2YgaG93IHNpbWlsYXIgdGhlIHRyaWFscyBhcmUgKENTLSBpcyBhbHdheXMgdW4tZW5mb3JjZWQgZm9yIGV4YW1wbGUpLiBDYW4gaW1hZ2luZSBjb25zaXN0ZW5jeSBpcyBhIHBhcmFtdGVyIHRoYXQgaXMgY29uY2lzdGVudCByZWdhcmRsZXNzIG9mIHJlaW5mb3JjZW1lbnQgLyBzdGltdWx1cyB0eXBlIHRob3VnaCwgZXNwZWNpYWxseSBpbiBsYXRlciBwaGFzZXMuIFNvIHdvcnRoIHRlc3RpbmcgYm90aCBtb2RlbHMuCgpBIHNpbWlsYXIgcGFyYW1ldGVyIGlzIFt1c2VkIGluIHRoZSBjaGFycGVudGllciBldCBhbC4gcGFwZXJdKGh0dHBzOi8vZjEwMDAuY29tL3dvcmsvaXRlbS82NzA3MTM0L3Jlc291cmNlcy81ODY0Nzc0L3BkZikgKHNlZSB0aGUgbGFzdCBwYWdlIGJlZm9yZSB0aGUgcmVmZXJlbmNlcykuCgpXZSB3aWxsIGVzdGltYXRlIHRoaXMgcGFyYW1ldGVyIGFzIGEgZmFjdG9yIHRoYXQgaW5mbHVlbmNlcyB0aGUgb3ZlcmFsbCBzaGFwZSBvZiB0aGUgY2hvaWNlIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiAoYmV0YSBkaXN0cmlidXRpdW9uKS4gSXQgd2lsbCBkbyB0aGlzIHZpYSB0aGUgc3VmZmljaWVudCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGluZmx1ZW5jZXMgYnkgc3RpbXVsdXMgdmFsdWUgZXRjIHBlciB0cmlhbC4KCioqbm90ZSB2ZXJ5IHVuc3VyZSBhYm91dCB0aGlzIC0gbmVlZCB0byBjaGVjayBpdCBvdXQgd2l0aCBBbGV4KioKCiQkc2hhcGUxKHN0aW11bHVzKSA9ICgxICsgZXhwKC1cbXUgKiBWUGx1c1t0LHBdICogKChWUGx1c1t0LHBdICogKDEtVlBsdXNbdCxwXSkpIC8gYmV0YVtwLDFdKSleLTEgJCQKd2hlcmUgJCRcbXUgPSBsb2dpdFxcc2Vuc2l0aXZ0eSQkCgpXaGVyZSBsb2dpdCBzZW5zaXRpdml0eSBlZmZlY3RpdmVseSBtZWFucyBjb25zaXN0ZW5jeSBvZiByYXRpbmcgY29uc2lzdGVuY3k7IGhpZ2hlciB2YWx1ZWQgc2hvdWxkIG1lYW4gZ3JlYXRlciBjb25zaXN0ZW5jeS4KCgpgYGB7cn0KCiMjIGRlY2lkZSB0ZXN0aW5nIHJhdGUgKG1pbixtZWQsbWF4IG9yIG9mZikKdGVzdGluZygnbWluJykKCiMjIHNldCB1cCBydW4Kc3Rhbm5hbWU9J2JldGFfbWVhbjFiZXRhX0NvbnNpc3RlbmN5LnN0YW4nCgpzdGFuZmlsZSA8LSBmaWxlLnBhdGgoc2NyaXB0ZGlyLCBzdGFubmFtZSkKCmZsYXJlX2RhdGE8LWxpc3QobnRyaWFscz1udHJpYWxzLG5zdWI9bnN1YixzY3JlYW1QbHVzID0gdChzY3JlYW1QbHVzKSwgc2NyZWFtTWludXM9IHQoc2NyZWFtTWludXMpLHJhdGluZ3NQbHVzPXQocGx1c19zY2FsZWQpLHJhdGluZ3NNaW51cz10KG1pbnVzX3NjYWxlZCkpCgpmbGFyZV9maXQgPC0gc3RhbihmaWxlID0gc3RhbmZpbGUsIGRhdGEgPSBmbGFyZV9kYXRhLCBpdGVyPWNoYWluX2l0ZXIsIGNoYWlucyA9IGNoYWluX24pICNhZGQgd29ya2luZyBkaXI/CgpzYXZlKGZsYXJlX2ZpdCwgZmlsZT1maWxlLnBhdGgoZGF0YWRpciwnZmxhcmVfZml0X3Rlc3QnKSkKCnRyYWNlcGxvdChmbGFyZV9maXQsJ2xwX18nKQoKIyBleHRyYWN0IGZpdCBkYXRhCnN1bW1hcnlfZmxhcmVfY29uIDwtIHN1bW1hcnkoZmxhcmVfZml0KQoKIyBleHRyYWN0IG1vZGVsIHN1bW1hcnkgZGF0YQoKI2ZsYXJlX2xvZ2xpa2U8LSBleHRyYWN0X2xvZ19saWsoZmxhcmVfZml0LCBwYXJhbWV0ZXJfbmFtZSA9ICJsb2dsaWsiLCBtZXJnZV9jaGFpbnMgPSBUUlVFKQoKCmBgYAoKYGBge3J9CiMjIGdldCBzb21lIGJhc2ljIG91dHB1dCBkZXNjcmlwdGlvbnMgcHJpbnRlZCB0byBzY3JlZW4KCm91dF9kZXNjcmliZShzdW1tYXJ5X2ZsYXJlX2NvbikKCmBgYAoKClRoZSBhbHBoYSBwYXJhbWV0ZXIgdmFyaWFuY2UgaXMgbm9ybWFsIChtZWFuIDAuNCBhbmQgc2QgMC4xMikuIEJldGEgaXMgbXVjaCBtb3JlIGJvdW5kZWQgbm93IHRob3VnaCAoY29tYmluZWQgYWNyb3NzIGJvdGggc3RpbXVsaSBtZWFuIDAuNzksIHNkPTEuNikgb3ZlciA0MDAwIGl0ZXJhdGlvbnMgb24gNCBjaGFpbnMuCgoKIyMjIyBDcmVhdGUgQklDIGZyb20gbG9nIGxpa2VsaWhvb2QKCmBgYHtyfQojIyBleHRyYWN0IGxvZyBsaWtlbGlob29kCgpmbGFyZV9sb2dsaWtlX2NvbiA8LSBleHRyYWN0X2xvZ19saWsoZmxhcmVfZml0LCBwYXJhbWV0ZXJfbmFtZSA9ICJsb2dsaWsiLCBtZXJnZV9jaGFpbnMgPSBUUlVFKQoKI2NhbGN1bGF0ZSBCSUMKCkZMQVJlX2JpYzwtYmljKG50cmlhbHMsLWNvbE1lYW5zKGZsYXJlX2xvZ2xpa2VfY29uKSwyKSAjbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhhdCBtb2RlbCBlLmcuIDQpCgojIyBtZWFuIEJJQyBhcyBtb2RlbCBjb21wYXJpc29ucyB0b29sOgoKcHJpbnQoIk1lYW4gQmF5ZXNpYW4gaW5mb3JtYXRpb24gY3JpdGVyaW9uIGZvciBtb2RlbCIpCm1lYW4oRkxBUmVfYmljKQoKYGBgCgojIyMjIEFkZCB0byBiYXIgcGxvdAoKYGBge3J9Cgptb2RfY29tcCA8LSByYmluZChuYS5vbWl0KG1vZF9jb21wKSxjKCIuLi5Db25zaXN0ZW5jeSIsbWVhbihGTEFSZV9iaWMpKSkKCnBsb3QgPC0gZ2dwbG90KG1vZF9jb21wLGFlcyh4PW1vZGVsLHk9QklDKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgY29vcmRfZmxpcCgpCgpzaG93KHBsb3QpCgpgYGAKCgojIyBHZW5lcmFsaXNhdGlvbgoKdGhpcyBpcyBzaW1pbGFyIHRvIFRvYnlzICdsZWFreSBiZXRhcycgSSB0aGluay4uLgoKQmFzaWNhbGx5IGhlcmUgd2Ugd2FudCB0byBjYXB0dXJlIGEgcGFyYW1ldGVyIHRoYXQgZXN0aW1hdGVzIGhvdyBtdWNoIHRoZSBsZWFybmluZyBmcm9tIHRoZSByZWluZm9yY2VkIHN0aW11bHVzIGluZmx1ZW5jZXMgcmVzcG9uc2VzIHRvIHRoZSAnc2FmZScgc3RpbXVsdXMuCgoKCgojIyBGb3JnZXR0aW5nCgp0aGlzIHBhcmFtdGVyIGlzIGhvcHcgbXVjaCB0aGV5IHJldGFzaW4gd2hhdCB0aGV5IGxlYXJuZWQgb3ZlciBwcmV2aW91cyB0cmlhbHMgYW5kIHVzZSBpdCB0byBpbmZvcm0gdGhlIGN1cnJlbnQgcmF0aW5nLgoKIyB0byBkbwoKKiBiaW4gdGhlIGdlbmVyYXRlZCByYXRpbmdzIHNvIHRoYXQgdGhleSByZWZsZWN0IHRoZSBuYXR1cmUgb2Ygb3JpZ2luYWwgc2NhbGUgKGkuZS4gbm90IGNvbnRpbnVvdXMgLSAwLTEgPT0gMSwgMS0yID09IDIgZXRjLikKCippbnZlc3RpZ3RlIGNoYW5nZSBwb2ludCBkZXRlY3Rpb24gcGFyYW10ZXJzICh3aGVuIHJlaW5mb3JjZW1lbnQgY2hhbmdlcyAtIGkuZS4gbW92aW5nIGFjcXVpc2l0aW9uIHRvIGV4dGluY3Rpb24pCiAgKiBjb3VsZCBkbyB0aGlzIG9yIG1vZGVsIHRoZSBwaGFzZXMgc2VwYXJhdGVseSAtIGNoZWNrIHdoaWNoIGJlc3QgZml0cwogIAoqYWRkIHByaW9ycyEgVGhlc2UgYXJlIHdoYXQgeW91IGV4cGVjdCB0aGUgZ3JvdXAgdG8gbG9vayBsaWtlIChpLmUgYWxwaGEgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYXJvdW5kIGEgbWVhbiBvZiAwLjUgd2l0aCB2YXJpYW5jZSBvZiAxMCBvciBzb21ldGhpbmcpCipMT09LVVAgUiBzdGFuIGNob2ljZSBvZiBwcmlvcnMuCiogY2FuIGhhdmUgaW5mb3JtYXRpdmUgb3IgdW5pbmZvcm1hdGl2ZSBwcmlvcnMgKGkuZS4gYWdub3N0aWMgb3Igbm90KQoKKiBBZGQgcGFyYW1ldGVycwoKKiBETyBOT1QgRk9SR0VUIFRPIE1BS0UgU1VSRSBXRSBIQVZFIEFOIEFDQ1VSQVRFIFNDUkVBTSBQQVRURVJOIFBFUiBQRVJTT04gRk9SIENTKyBJTiBBQ1FVSVNJVElPTgoKIyBQdXNoIGFueSB1cGRhdGVzIHRvIGdpdGh1YiAKCiMjIyMjIEFueSBwdXNoIHRoZSB1cGRhdGVzIHRvIGdpdGh1YgoKVW5oYXNoIHRoZSBzZXJpZXMgYmVsb3cgaWYgeW91IG1hZGUgYW55IGNoYW5nZXMuCgoKYGBge2Jhc2h9CgojIyBpbml0aWFsaXNlIGJhc2ggZGlyZWN0b3J5IGFuZCBmaWxlbmFtZQpzdGFubmFtZT0icHVuaXNoX29ubHkuc3RhbiIKc2NyaXB0ZGlyPSIvVXNlcnMva2lyc3Rpbi9Ecm9wYm94L1NHRFAvRkxBUmUvRkxBUmVfTUFTVEVSL1Byb2plY3RzL0hpZXJhY2hhbF9tb2RlbGxpbmcvU2NyaXB0cyIKCgojIyBzdGFnZQojZ2l0IGFkZCAkc2NyaXB0ZGlyLyRzdGFubmFtZQoKCiMjIHB1c2ggCgojZ2l0IHB1c2ggQmF5ZXNfbW9kZWxsaW5nIAoKCmBgYAoKCgoKCgo=